WpfToolkit DataGrid:突出显示已修改的行
有没有办法突出显示DataGrid上的所有修改行? 由于网格绑定到System.Data.DataTable
我想我可能能够将每行的颜色绑定到它的RowState(下面的示例),但这似乎不起作用。
有任何想法吗?
xmlns:data="clr-namespace:System.Data;assembly=System.Data"
更新
在你发布了你的xaml之后,显然在xaml中找不到问题。 我很快就看了msdn的DataTable类,我看不到让WPF检测到RowState
-property变化的机制。 因此,直接绑定到此属性不会给您可靠的结果。
看来你必须包装你的数据项。 我建议为项目创建一个ViewModel,并添加一个属性,说明该行是否已通过更改通知( INotifyPropertyChanged
或DP)更改并绑定到此属性。 肯定会有其他替代方案,但IMO在每个项目上创建一个VM在大多数情况下是最好的解决方案。
我知道这个post已经老了,但由于这个问题在.Net 4中没有修复,我想我会发布我的解决方法。 它有点笨重(不优雅),但至少它使用数据触发器和工作。
- 向您的DataTable添加一个伪ModifiedDate列(或者如果您不关心日期,只需添加一个虚拟列来指示rowstate)。
- 在XAML中添加DataTrigger,引用ModifiedDate列和所需的格式。
- 在引用RowState的XAML中添加一个DataTrigger(这只会处理Adds并保持不变,所以要担心的事件少一个)。
- 将RowChanged事件添加到ADO.Net数据集中,该数据集填充ModifiedDate列中的内容(应与您的第一个DataTrigger对应)。
- 在您将数据推送到数据库的已保存事件中,在结尾处清空您的虚拟ModifiedDate列(其中RowState =未更改)(重要提示:请务必检查rowstate以确认在保存期间未发生错误。
这是有效的,最重要的是,每次修改行时都不需要执行Items.Refresh。 话虽如此,如果有人有更好(更优雅)的方式来完成这个,那么请发帖。
INotifyPropertyChanged
不是WPF绑定可用于更改通知的唯一接口,它只是我们最常用的接口。 正如Bea Stollnitz所写 ,ADO DataView
实现了IBindingList
,它通过在列表或其中的项目发生更改时引发ListChanged
来实现更改通知。
这表明了一种获得你想要的东西的方法,尽管我没有试过它看它是如何工作的。 您可以从DataView
派生一个类来监听DataTable.RowChanged
事件,如果该行在视图中并且其RowState
更改,则会引发ListChanged
。
如果不使用任何代码隐藏或实现视图模型,您将无法在XAML中实例化这个新的DataView
,因为如果您只是绑定到DataTable
,它将创建一个普通的DataView
。 但你也可以解决这个问题:子类DataTable
并覆盖GetDefaultView
使其返回新DataView
的实例,然后inheritanceDataSet
并覆盖Tables
以使其返回新DataTable
的实例。 (这些类似乎都没有密封,谢天谢地。)
编辑
当然,并不是那么简单。 DataView
公开的列表是DataRowView
对象的集合。 DataRowView
实现了INotifyPropertyChanged
。 我认为WPF使用DataView
上的IBindingList
接口进行集合更改通知,并在DataRowView
上侦听PropertyChanged
,但老实说,我需要多花点时间才能确定。
DataRowView
仅在其行中的列值发生更改时才会引发PropertyChanged
。 我没有看到任何方法在没有子类化DataRowView
情况下将其他属性的更改通知注入其中,虽然原则上可能,但是我看不到一种直接的方法来创建DataView
来创建这些新的DataRowView
对象。