2015-07-10 126 views
1

我有一個網格綁定到一組虛擬機。當我使用DataTemplateSelector作爲我的DataGridTemplateColumn時,我將整個虛擬機作爲一個數據項目,我如何將它縮小到一個特定的屬性值(否則,我必須爲每個虛擬機創建'DataTemplateSelector'或使用接口,而這兩個過於繁瑣)?WPF DataGrid CellTemplateSelector項目

Bind a property to DataTemplateSelector,但它看起來像一個討厭的解決方法。

回答

1

您可以在DataTemplateSelector的派生類中使用Expressions Trees,我稱其爲PropertyTemplateSelector。在這裏它的代碼:

public abstract class PropertyTemplateSelector : DataTemplateSelector 
{ 
    private Delegate getPropertyValue; 
    private string propertyName; 
    private Type itemType; 

    public string PropertyName 
    { 
     get 
     { 
      return propertyName; 
     } 
     set 
     { 
      propertyName = value; 
     } 
    } 

    public Type ItemType 
    { 
     get 
     { 
      return itemType; 
     } 
     set 
     { 
      itemType = value; 
     } 
    } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (ItemType.IsInstanceOfType(item)) 
     { 
      if (getPropertyValue == null) 
      { 
       System.Linq.Expressions.ParameterExpression instanceParameter = 
        System.Linq.Expressions.Expression.Parameter(item.GetType(), "p"); 

       System.Linq.Expressions.MemberExpression currentExpression = 
        System.Linq.Expressions.Expression.PropertyOrField(instanceParameter, PropertyName); 

       System.Linq.Expressions.LambdaExpression lambdaExpression = 
        System.Linq.Expressions.Expression.Lambda(currentExpression, instanceParameter); 

       getPropertyValue = lambdaExpression.Compile(); 
      } 

      return SelectTemplateImpl(getPropertyValue.DynamicInvoke(item), container); 
     } 

     return base.SelectTemplate(item, container); 
    } 

    protected abstract DataTemplate SelectTemplateImpl(object propertyValue, DependencyObject container); 
} 

您只需通過實現SelectTemplateImpl方法與自己的邏輯擴展此類。正如您所看到的,PropertyTemplateSelector將項目對象縮小到特定的屬性值(將其傳遞給SelectTemplateImpl方法)。例如,我以這種方式創建一個NameTemplateSelector

public class NameTemplateSelector : PropertyTemplateSelector 
{ 
    protected override DataTemplate SelectTemplateImpl(object propertyValue, DependencyObject container) 
    { 
     string name = (string)propertyValue; 

     if (name != null && name.StartsWith("A", StringComparison.OrdinalIgnoreCase)) 
     { 
      return (DataTemplate)App.Current.MainWindow.FindResource("VipName"); 
     } 

     return (DataTemplate)App.Current.MainWindow.FindResource("NormalName"); 
    } 
} 

的,你可以伊斯利使用這些模板選擇在您的XAML

​​

我希望它可以幫助你。