WPF数据触发器只工作1次

本文关键字:工作 1次 触发器 数据 WPF | 更新日期: 2023-09-27 18:13:50

我正在尝试WPF,我有一个ObservableCollection连接到ListView的应用程序。它完美地添加了项目,所有的东西都在一起。它正在从实时源接收数据,因此项值正在更新,行正在添加。但现在我想让最近的行高亮显示,文本改变,以显示这一行被改变了。因此,我设置了一个数据触发器,并向ObservableCollection中的DataType添加了一个名为RecentlyChanged的值。如果为真,则将文本设置为红色,否则文本为黑色。

当我运行这段代码时,列表项变成红色,然后再也不会变回来,我已经尝试了所有的方法,它让我感到不安。我已经检查了调试器,甚至当值为no时(我使用字符串yesno,因为我想尝试各种数据类型)它保持红色。数据触发器的代码如下:

——编辑:添加了第二个数据触发器,我之前尝试使用无效。

<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>

WPF数据触发器只工作1次

问题在于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魔术应该照顾剩下的。