WPF数据触发器只工作1次
本文关键字:工作 1次 触发器 数据 WPF | 更新日期: 2023-09-27 18:13:50
我正在尝试WPF,我有一个ObservableCollection
连接到ListView
的应用程序。它完美地添加了项目,所有的东西都在一起。它正在从实时源接收数据,因此项值正在更新,行正在添加。但现在我想让最近的行高亮显示,文本改变,以显示这一行被改变了。因此,我设置了一个数据触发器,并向ObservableCollection
中的DataType
添加了一个名为RecentlyChanged
的值。如果为真,则将文本设置为红色,否则文本为黑色。
当我运行这段代码时,列表项变成红色,然后再也不会变回来,我已经尝试了所有的方法,它让我感到不安。我已经检查了调试器,甚至当值为no
时(我使用字符串yes
和no
,因为我想尝试各种数据类型)它保持红色。数据触发器的代码如下:
——编辑:添加了第二个数据触发器,我之前尝试使用无效。
<ListView ItemsSource="{Binding DataTable, UpdateSourceTrigger=PropertyChanged}">
<ListView.Resources>
<Style TargetType="ListViewItem">
<Setter Property="Foreground" Value="Black"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=RecentlyChanged}" Value="yes">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=RecentlyChanged}" Value="no">
<Setter Property="Foreground" Value="Black" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Resources>
问题在于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魔术应该照顾剩下的。