我有一個網格綁定到一組虛擬機。當我使用DataTemplateSelector
作爲我的DataGridTemplateColumn
時,我將整個虛擬機作爲一個數據項目,我如何將它縮小到一個特定的屬性值(否則,我必須爲每個虛擬機創建'DataTemplateSelector'或使用接口,而這兩個過於繁瑣)?WPF DataGrid CellTemplateSelector項目
鋸Bind a property to DataTemplateSelector,但它看起來像一個討厭的解決方法。
我有一個網格綁定到一組虛擬機。當我使用DataTemplateSelector
作爲我的DataGridTemplateColumn
時,我將整個虛擬機作爲一個數據項目,我如何將它縮小到一個特定的屬性值(否則,我必須爲每個虛擬機創建'DataTemplateSelector'或使用接口,而這兩個過於繁瑣)?WPF DataGrid CellTemplateSelector項目
鋸Bind a property to DataTemplateSelector,但它看起來像一個討厭的解決方法。
您可以在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
我希望它可以幫助你。