gpt4 book ai didi

c# - WPF DataTrigger 只工作 1 次

转载 作者:行者123 更新时间:2023-11-30 20:48:16 30 4
gpt4 key购买 nike

我正在试用 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>

最佳答案

问题是 ObservableCollection 只报告对集合本身的更改,换句话说,它会在添加或删除项目时触发 CollectionChanged 事件,但不会在这些项目的属性发生变化。为了实现预期的结果——当项目的属性发生变化时更新数据触发器——项目本身必须实现 INotifyPropertyChanged 接口(interface)并在所需的属性为设置。

在这种情况下,您可以使用以下内容:

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 魔法应该会处理剩下的事情。

关于c# - WPF DataTrigger 只工作 1 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24852787/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com