【问题标题】:Is there a collection that doesn't subscribe to INotifyPropertyChanged?是否有不订阅 INotifyPropertyChanged 的​​集合?
【发布时间】:2011-06-18 17:20:51
【问题描述】:

我有一个使用INotifyPropertyChanged 的类,并且有一个绑定到网格的列表。每次该对象更改时,它都会更新网格中的值。但是由于历史原因,我想将该对象添加到集合/列表并绑定到历史网格以显示所有更改。然而,我尝试过的每个列表似乎都订阅了INotifyPropertyChanged,所以我在历史网格中只能获得相同数量的项目。

是否有不订阅INotifyPropertyChanged 的列表/集合?

谢谢

【问题讨论】:

  • 很难准确理解您在此处所说的内容。据我所知,列表本身并没有绑定到 INotifyPropertyChanged。能否提供一些示例代码?
  • 我不是 100% 确定我是否遵循您想要的,但是如果您想绑定列表的旧版本,那么为什么不在您想要记录历史的时间点克隆它?
  • 列表订阅 INotifyPropertyChanged 事件,所以如果一个项目发生变化,它会反映在列表中,不是吗?我不希望这种情况发生在我的情况下。我希望每个更改的列表中都有单独的条目
  • 集合对象本身不会订阅 INotifyPropertyChanged 事件。网格是。 Grid 应该反映它所绑定的模型的当前状态。听起来您真正想要的是订阅原始数据模型的自定义“历史”模型。每次原始模型发生变化时,都会导致历史数据模型创建一个新实例。

标签: c# .net .net-3.5 c#-3.0 inotifypropertychanged


【解决方案1】:

考虑在绑定中使用Mode=OneTimehttp://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S3

【讨论】:

    【解决方案2】:

    如果您的 List 是对某个类的引用列表,您将需要对整个列表进行“深度克隆”以维护历史副本。否则,列表内容的副本仍将是对正在更改的“活动”对象的引用。这样做需要如下代码:

    // This requires a way to "Clone" your object...
    List<YourClass> listCopy = originalList.Select(item => item.Clone()).ToList();
    

    如果列表包含值类型(结构),您可以创建一个新的List&lt;YourType&gt; 并将原始元素复制过来。

    // If your type is a value type, you can just copy the list directly...
    var listCopy = originalList.ToList();
    

    另外 - 这与INotifyPropertyChanged 无关。列表本身与 PropertyChanged 事件无关。

    【讨论】:

    • 唯一的问题是我有很多类都引用了 MyClass 所以我必须序列化所有其他类
    • @Jon:是的,如果您想保留完整的历史记录,那么您几乎会在那时强制对数据进行完全序列化。否则,当您更新参考资料时,它也会反映在任何“旧”副本中。
    猜你喜欢
    • 2011-08-04
    • 2022-01-04
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2011-05-07
    • 2013-06-23
    相关资源
    最近更新 更多