【问题标题】:WPF - setting properties to themselves fails to fire changed eventWPF - 为自己设置属性无法触发更改的事件
【发布时间】:2014-12-23 15:29:16
【问题描述】:

这是一个奇怪的行为。我们最近在一个 WPF MVVM 应用程序中构建了一些代码,看起来有点像这样:

foreach (var mA in Preferences.Where(itm => itm.Preference == "Y"))
{
    Member m = _members.FirstOrDefault(itm => itm.MemberID == mA.MemberAvertedID);
    if (m != null)
    {
        m.Selected = true;
    }
}

Members = _members;

因此,FirstOrDefault 获取对成员的引用,该引用已更新。成员和 _members 实际上是相同的 - 前者是一个属性,将后者包装为一个私有变量,并带有事件触发:

public ObservableCollection<Member> Members
{
    get
    {return _members;}

    set
    {
            _members = value;
            OnPropertyChanged("Members");
    }
}

将 Members 设置为 _members 的目的只是为了让事件触发 - 但它不起作用。当您逐步完成时,触发了 OnPropertyChanged 事件,但应用程序没有响应。但是,这确实有效:

foreach (var mA in Preferences.Where(itm => itm.Preference == "Y"))
{
    Members m = _members.FirstOrDefault(itm => itm.MemberID == mA.MemberAvertedID);
    if (m != null)
    {
        mtc.Selected = true;
    }
}

var mem = new ObservableCollection<Members>(_members);
Members = mem;

我假设这里发生的事情是因为将成员设置为 _members 实际上是属性设置本身,代码“假定”没有任何变化,并跳过事件。但我对这个解释并不满意。谁能进一步说明这里发生了什么?

【问题讨论】:

  • MembersToCount 是另一个属性吗?你不应该/而不是为Members 属性引发属性更改事件吗?
  • MembersToCount 这是什么?你能显示你的那个属性的代码吗?
  • ..另外,最后一个示例中有错字吗?将OC&lt;MembersToCount&gt; 分配给类型为OC&lt;Member&gt; 的Members 变量肯定会导致编译错误
  • 对不起,对不起,糟糕的复制和粘贴工作。希望现在更有意义。很抱歉浪费了大家的时间。
  • @MattThrower 它不起作用,因为它仍在检查 UI 刷新之前值是否已更改。如果您想这样做,您可以先将其设置为 null,然后再设置为 _members

标签: c# wpf mvvm properties inotifypropertychanged


【解决方案1】:

除非集合引用不同,否则绑定到 ObservableCollections 不会重新绑定列表,因此最后一段代码正在工作。也就是说,除非您实际上是在基础 _members 列表中添加或删除项目,否则您不必重新绑定整个列表。

所以(我假设)如果您的目标是刷新选定成员的状态,您可能缺少从 Selected 属性中引发的 OnPropertyChanged("Selected")

总而言之:正在更改的属性必须在 PropertyChanged 事件中命名。并且事件必须来自拥有该属性的对象。在这种情况下,通知 WPF Selected 属性的更改需要在 Member 实例上引发事件。

【讨论】:

  • 对不起 - 你说得对,但我做了一些可怕的错别字来简化示例的代码。我们在实际生产代码中提出了正确的属性。
  • 太好了,谢谢。我没有意识到你可以在属性的属性上引发事件!
  • 确实如此。我只是在等着看有没有其他人加入。
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多