有没有办法突出显示DataGrid上的所有已修改行?由于网格绑定到System.Data.DataTable
,我想我可以将每行的颜色绑定到它的RowState(下面的示例),但这似乎不起作用。
有什么想法吗?
xmlns:data="clr-namespace:System.Data;assembly=System.Data"
<Style x:Key="DataGridRowStyle" TargetType="{x:Type toolkit:DataGridRow}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Background" Value="Blue" />
</Trigger>
<DataTrigger Binding="{Binding RowState}" Value="{x:Static data:DataRowState.Modified}">
<Setter Property="Background" Value="LightYellow" />
</DataTrigger>
</Style.Triggers>
</Style>
答案 0 :(得分:4)
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding RowState}" Value="{x:Static data:DataRowState.Modified}">
<Setter Property="Background" Value="LightYellow" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<强>更新强>
在你发布了你的xaml后,显然在xaml中找不到问题。我很快就看了msdn的DataTable类,我看不到让WPF检测到RowState
- 属性变化的机制。因此,直接绑定此属性不会给您可靠的结果
看来你必须包装你的数据项。我建议为项目创建一个ViewModel,并添加一个属性,说明该行是否已通过更改通知(INotifyPropertyChanged
或DP)更改并绑定到此属性。肯定会有其他替代方案,但IMO在每个项目上创建一个VM在大多数情况下是最佳解决方案。
答案 1 :(得分:2)
我知道这个帖子已经过时了,但由于这个问题在.Net 4中没有修复,我想我会发布我的解决方法。它有点笨重(不优雅),但至少它使用数据触发器和工作。
这是有效的,最重要的是,每次修改行时都不需要执行Items.Refresh。话虽如此,如果有人有更好(更优雅)的方式来完成这个,那么请发帖。
答案 2 :(得分:1)
INotifyPropertyChanged
不是WPF绑定可用于更改通知的唯一接口,它只是我们最常用的接口。作为Bea Stollnitz writes,ADO DataView
实施IBindingList
,当列表或其中的项目发生更改时,ListChanged
会通过提升DataView
来实施更改通知。
这表明了一种获得你想要的东西的方法,尽管我还没有尝试过它是如何工作的。您可以从DataTable.RowChanged
派生一个听取ListChanged
事件的类,如果该行在视图中并且其RowState
已更改,则会引发DataView
。
如果不使用任何代码隐藏或实现视图模型,您将无法在XAML中实例化此新DataTable
,因为如果您只是绑定到DataView
,它将创建一个正常{ {1}}。但你也可以解决这个问题:子类DataTable
并覆盖GetDefaultView
以使其返回新DataView
的实例,然后继承DataSet
并覆盖Tables
使其返回新DataTable
的实例。 (这些类似乎都没有密封,谢天谢地。)
修改强>
当然不是那么简单。 DataView
公开的列表是DataRowView
个对象的集合。 DataRowView
实施INotifyPropertyChanged
。我认为WPF使用IBindingList
上的DataView
接口进行收集更改通知,并在PropertyChanged
上收听DataRowView
,但老实说,我需要挖掘更多可以肯定。
DataRowView
仅在其行中的列值发生更改时才会引发PropertyChanged
。我没有看到任何方法在没有子类化DataRowView
的情况下将其他属性的更改通知注入其中,虽然原则上这是可能的,但是我看不到一种直接的方法来创建这些子类DataView
新的DataRowView
个对象。