我正在尝试WPF,并且我有一个ObservableCollection
连接到ListView
的应用程序。它完美地添加了物品,一切都在一起。它从实时源中获取数据,因此项目值正在更新并且正在添加行。但是现在我希望突出显示最近的行,更改文本,以显示正在更改此特定行。因此,我设置了一个数据触发器,并为名为DataType
的{{1}}中的ObservableCollection
添加了一个值。如果为true,则将文本设置为红色,否则文本为黑色。
当我运行此代码时,列表项会变为红色,然后再也不会改回来,我已经尝试了所有内容,而且它正在让我失望。我已经检查了调试器,甚至当值为RecentlyChanged
时(我正在使用字符串no
和yes
,因为我想尝试各种数据类型)它保持红色。数据触发器的代码如下:
- 编辑:在我尝试使用的第二个数据触发器中添加之前无效。
no
答案 0 :(得分:4)
问题是ObservableCollection
仅报告对集合本身的更改,换句话说,它会在添加或删除项目时触发CollectionChanged
事件,但不会在这些项目的属性发生更改时触发。为了实现所需的结果 - 在项目属性更改时更新数据触发器 - 项目本身必须实现INotifyPropertyChanged
接口并在设置了所需属性时触发PropertyChanged
事件。
在这种情况下,您可以使用以下内容:
using System.ComponentModel;
public class ListViewItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
var propChanged = PropertyChanged;
if(propChanged != null)
{
propChanged(this, new PropertyChangedEventArgs(name));
}
}
private string recentlyChanged = "yes"; // Recently changed on creation
public string RecentlyChanged
{
get { return recentlyChanged; }
set {
recentlyChanged = value;
OnPropertyChanged("RecentlyChanged");
}
}
// ... define the rest of the class as usual
}
WPF魔术应该照顾其余部分。