【问题标题】:Notify Property Changed Event without setter在没有设置器的情况下通知属性更改事件
【发布时间】:2011-10-24 05:53:50
【问题描述】:

我正在使用 MVVM 架构师开发 WPF 应用程序,并且作为常见场景使用属性来通知更改,例如

public List<EmployeeInfo> Employees
    {
            get
            {
                return _employees;
            }
            set
            {
                _employees = value;
                NotifyPropertyChanged(() => Employees);
            }
        }

我唯一的问题是我正在使用属性设置器来通知应用程序有关对某些值所做的更改,根据 FxCop,这是一种不好的做法,'CollectionPropertiesShouldBeReadOnly'。所以我想对此进行一些改进,所以告诉我一些机制,我可以使用通知属性更改而不使用 setter。

【问题讨论】:

  • ObservableCollection 本身已经支持通知更改,为什么要在这里添加自己的?

标签: c# wpf mvvm


【解决方案1】:

如果您的集合属性是只读的,则您无需通知任何整个集合已更改为不同的集合 - 相反,集合上的事件处理程序会收到通知集合内的变化(添加项目等)。

如果您需要能够更改属性在视图模型中引用的集合,您始终可以将设置器设为私有并保留现有的通知机制。

【讨论】:

  • 我的集合属性不是只读的,但我不想为它编写 setter,用户可以直接从中添加或删除任何东西,我只想让它在发生时通知我,请不要指望它总是 Observable 集合,它可以是任何 List、IEnumerable、字典等。谢谢
  • @MSingh:这会产生巨大的不同——如果是List&lt;T&gt;,那么没有通知机制。这就是ObservableCollection&lt;T&gt; 的全部。听起来您并不清楚只读 property (没有设置器的)和不可变 collection (其内容可以' t 被改变)。听起来您只需要一个只读属性,但返回一个可变(可变)集合。如果您希望该集合通知听众,您必须使用ObservableCollection&lt;T&gt; 或类似的东西。
  • 是的,我对这些场景有点困惑,但感谢您的帮助。非常感谢
【解决方案2】:

ObservableCollection 本身会通知发生的变化。所以你不需要引发 PropertyChanged 事件。如果您认为有必要更改集合,则可以删除和添加项目。由于可观察到的模式,更改将被公布。

【讨论】:

    【解决方案3】:

    您使用 setter 的事实意味着您试图用新的对象实例替换集合的实例。如果您只是担心集合中项目的更改,那已经内置在 observablecollection 中。无论您是否调用了 notifypropertychanges,FxCop 都会抱怨 setter。

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2019-06-16
      • 2012-04-01
      相关资源
      最近更新 更多