WPF 工具包中的 DataGridCell 样式 DataTrigger

3

我正在尝试在DataGrid中,如果值已更新,将单元格的颜色更改为黄色。

我的XAML代码:

<toolkit:DataGrid x:Name="TheGrid"
                  ItemsSource="{Binding}"
                  IsReadOnly="False"
                  CanUserAddRows="False"
                  CanUserResizeRows="False"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="False"                             
                  SelectionUnit="CellOrRowHeader" 
                  EnableColumnVirtualization="True" 
                  VerticalScrollBarVisibility="Auto"
                  HorizontalScrollBarVisibility="Auto">
    <toolkit:DataGrid.CellStyle>
        <Style TargetType="{x:Type toolkit:DataGridCell}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsDirty}" Value="True">
                    <Setter Property="Background" Value="Yellow"/>
                 </DataTrigger>
            </Style.Triggers>
        </Style>
    </toolkit:DataGrid.CellStyle>
</toolkit:DataGrid>

网格绑定到一个数组列表(显示类似于Excel的值表)。 数组中的每个值都是包含IsDirty依赖属性的自定义对象。 当更改值时,IsDirty属性被设置。
当我运行此操作时:
更改列1中的值=整行变为黄色
更改任何其他列中的值=不会发生任何事情
无论在哪一列中,我只希望更改的单元格变成黄色。 您是否看到我的XAML有什么问题?
1个回答

8
这种情况发生的原因是DataContext在行级别上设置,并且不会为每个DataGridCell更改。因此,当您绑定到IsDirty时,它会绑定到行级别数据对象的属性,而不是单元格级别数据对象的属性。
由于您的示例显示您将AutoGenerateColumns设置为false,我假设您自己生成列并且有像DataGridTextColumn这样的列,其Binding属性设置为绑定到实际值字段。要将单元格样式更改为黄色,您需要像这样更改每个DataGridColumnCellStyle
foreach (var column in columns)
{
    var dataColumn =
        new DataGridTextColumn
            {
                Header = column.Caption,
                Binding = new Binding(column.FieldName),
                CellStyle = 
                new Style
                    {
                        TargetType = typeof (DataGridCell),
                        Triggers =
                            {
                                new DataTrigger
                                    {
                                        Binding = new Binding(column.FieldName + ".IsDirty"),
                                        Setters =
                                            {
                                                new Setter
                                                    {
                                                        Property = Control.BackgroundProperty,
                                                        Value = Brushes.Yellow,
                                                    }
                                            }
                                    }
                            }
                    }
            };
    _dataGrid.Columns.Add(dataColumn);
}

您可以尝试使用DataGridColumn.CellStyle更改每个单元格的DataContext。也许只有这样,您才能像不用为每一列单独进行操作那样直接从网格级样式绑定单元格到“IsDirty”。但是我没有您需要测试的实际数据模型。

太棒了!这正是我需要的。我唯一需要改变的是在DataTrigger中添加Value=true(这样它就会在IsDirty为true时触发)。 - KrisTrip
1
我想尝试用XAML编写我的样式,这可行吗? - jrwren
这很好。然而--我正在尝试在WPF中实现这个,但这似乎是来自System.Windows.Controls命名空间的代码。有没有一种类似于System.Windows.Forms的方法可以做到类似的事情?我无法找到任何资源。谢谢! - mpsyp
抱歉,实际上我正在使用System.Windows.Controls.DataGrid在一个同时使用System.Windows.Forms的插件中。多个命名空间和using语句让我有些困惑。话虽如此,我的Binding类也没有只带一个参数的构造函数。那是哪个命名空间?此外,“column.FieldName”是列上自定义属性的替代品吗?谢谢。 - mpsyp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接