.net 如何根据源对象上谓词的结果有条件地绑定样式?

.net 如何根据源对象上谓词的结果有条件地绑定样式?,.net,wpf,data-binding,.net,Wpf,Data Binding,我有一个WPF数据网格,我正在用数据视图中的数据填充它。我希望根据应用于源对象的谓词函数的结果,有条件地将样式应用于DataGrid的每个单元格 我仍然没有“获得”WPF数据绑定,所以我不知道该怎么做,或者从哪里开始。有人能给我一些建议或解决方案吗?没有标准(如“仅限XAML”)方法来进行这种绑定。绑定本身允许在可视元素和源上的属性值(实例或静态)之间指定1:1关系。属性不是通过属性自动表示的,因此不能绑定到它们 但是,您可以编写自定义转换器,该转换器接受源代码,检查类型是否存在属性,并返回您关

我有一个WPF数据网格,我正在用数据视图中的数据填充它。我希望根据应用于源对象的
谓词
函数的结果,有条件地将样式应用于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;
    }
}