.net 如何根据源对象上谓词的结果有条件地绑定样式?
我有一个WPF数据网格,我正在用数据视图中的数据填充它。我希望根据应用于源对象的.net 如何根据源对象上谓词的结果有条件地绑定样式?,.net,wpf,data-binding,.net,Wpf,Data Binding,我有一个WPF数据网格,我正在用数据视图中的数据填充它。我希望根据应用于源对象的谓词函数的结果,有条件地将样式应用于DataGrid的每个单元格 我仍然没有“获得”WPF数据绑定,所以我不知道该怎么做,或者从哪里开始。有人能给我一些建议或解决方案吗?没有标准(如“仅限XAML”)方法来进行这种绑定。绑定本身允许在可视元素和源上的属性值(实例或静态)之间指定1:1关系。属性不是通过属性自动表示的,因此不能绑定到它们 但是,您可以编写自定义转换器,该转换器接受源代码,检查类型是否存在属性,并返回您关
谓词
函数的结果,有条件地将样式应用于DataGrid的每个单元格
我仍然没有“获得”WPF数据绑定,所以我不知道该怎么做,或者从哪里开始。有人能给我一些建议或解决方案吗?没有标准(如“仅限XAML”)方法来进行这种绑定。绑定本身允许在可视元素和源上的属性值(实例或静态)之间指定1:1关系。属性不是通过属性自动表示的,因此不能绑定到它们
但是,您可以编写自定义转换器,该转换器接受源代码,检查类型是否存在属性,并返回您关心的样式名称。如果您想让它更漂亮,属性可以具有实际的样式名称,尽管这意味着您的业务模型将与表示有半紧密的联系,因为现在它将具有关于视图逻辑的特定知识
您可以在MSDN上的数据绑定概述中看到自定义转换器的示例(http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion). 在特定情况下,必须创建与源对象本身的绑定(不指定路径),以便将实际实例作为Convert方法中的值。这将允许您获取类型并检查属性,然后创建样式对象以返回绑定
更新:如果要设置特定单元格的样式,需要关闭AutoGenerateColumns并为特定单元格指定DataGridTemplateColumn。然后指定自己的数据模板,即绑定到对象的数据模板,并使用样式选择器。您可以使用
DataGridTemplateColumn
和CellTemplateSelector
基于视图模型中的任意属性为单元格选择数据模板
在资源中:
<DataTemplate x:Key="SomeCellStyle" DataType="{x:Type local:MyItemViewModel}">
<TextBlock Text="{Binding Whatever}" />
</DataTemplate>
<DataTemplate x:Key="OtherCellStyle" DataType="{x:Type local:MyItemViewModel}">
<TextBlock Text="{Binding Whatever}" />
</DataTemplate>
我已经尝试过
样式选择器
,但我想不出一种方法来将DataGrid.ItemContainerStyleSelector
应用于单个单元格而不是行。。。
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplateSelector>
<local:MyItemDataTemplateSelector TypeProperty="Type"
DefaultTemplate="{StaticResource SomeCellStyle}"
SomeTemplate="{StaticResource SomeCellStyle}"
OtherTemplate="{StaticResource OtherCellStyle}" />
</DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>
public class MyItemViewModel
{
public MyEnum Type { get; set; }
}
public class MyItemDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultTemplate { get; set; }
public DataTemplate SomeTemplate { get; set; }
public DataTemplate OtherTemplate { get; set; }
public string TypeProperty { get; set; }
public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
if (item != null)
{
var type = item.GetType();
var property = type.GetProperty(TypeProperty);
if (property != null)
{
var value = property.GetValue(item, null);
if (value != null)
{
switch ((MyEnum) value)
{
case MyEnum.SomeValue: return SomeTemplate;
case MyEnum.OtherValue: return OtherTemplate;
}
}
}
}
return DefaultTemplate;
}
}