2017-06-12 5 views
1

J'ai une grille avec (n) des colonnes générées dynamiquement. Une des exigences est qu'une ligne ne soit montrée dans la grille que si une valeur non nulle/non nulle existe dans l'une des colonnes affichées. J'utilise un XamGrid Infragistics, qui a l'option d'utiliser un filtre de ligne qui acceptera une expression comme critère de filtre. J'ai lié la clé de mes colonnes aux propriétés MyObject. J'essaie de générer une chaîne d'expressions en fonction des colonnes de ma grille qui sont affichées. Voici quelques pseudo-code qui montre une idée de ce que je suis en train d'accomplirComment puis-je combiner (n) des expressions en utilisant LINQ?

System.Linq.Expressions.Expression<Func<MyObject, bool>> expr = product => 
{ 
    foreach (var p in MyGrid.Columns.Where(co => co.DataType == typeof (decimal?) && co.Visibility == Visibility.Visible)) 
    { 
     Expression<Func<MyObject, bool>> exprInner = lrnc => ((decimal?) lrnc.GetPropValue(p.Key)) != 0.0m; 
     combined = System.Linq.Expressions.Expression.OrElse(combined.Body, exprInner.Body); 
    } 
}; 
+3

Comme ça? http://www.albahari.com/nutshell/predicatebuilder.aspx – hatchet

+0

@hatchet Merci, ça m'a donné toutes les infos dont j'avais besoin. – TychoBrahe

Répondre

0

Un grand merci à Hatchet et son lien. J'ai été capable de combiner dynamiquement des expressions basées sur des propriétés réfléchies pour créer un RowsFilter pour mon XamGrid.

private RowsFilter m_rowsFilter; 

private void CreateFilter() 
{ 
    CustomComparisonCondition c = new CustomComparisonCondition(); 

    var predicate = PredicateBuilder.False<LineRatingNodeComparison>(); 
    foreach (string colKey in MyXamGrid.Columns.Where(co => co.DataType == typeof (decimal?) && co.Visibility == Visibility.Visible).Select(co => co.Key)) 
    { 
     string tempKey = colKey; 
     predicate = predicate.Or(p => p.GetPropValue(tempKey) != null && (decimal?) p.GetPropValue(tempKey) != 0.0m); 
    } 
    c.Expression = predicate; 

    //Add the RowsFilter to one column that always exists on the grid. 
    m_rowsFilter = new RowsFilter(typeof (MyObject), MyXamGrid.Columns.DataColumns["Company"]); 
    m_rowsFilter.Conditions.Add(c); 
    MyXamGrid.FilteringSettings.RowFiltersCollection.Add(m_rowsFilter); 
}