【问题标题】:Is it possible to NotifyChanged on an ObservableCollection property via CollectionChanged event?是否可以通过 CollectionChanged 事件对 ObservableCollection 属性进行 NotifyChanged?
【发布时间】:2012-04-15 04:33:52
【问题描述】:

我是否可以将 ObservableCollection 作为类中的属性但订阅它的 CollectionChanged 事件并在 ObservableCollection 属性上调用 OnPropertyChanged 以更新与集合的 UI 绑定? -

【问题讨论】:

    标签: c# wpf observablecollection inotifypropertychanged


    【解决方案1】:

    您可以公开一个只读的 ItemNames 属性,而不是绑定到集合并使用转换器。在 Items.CollectionChanged 事件处理程序中,您为 ItemNames 属性引发 PropertyChanged 事件

    public class ViewModel
    {
    
          public ViewModel()
          {
               Items = new ObservableCollection<Item>();
               Items.CollectionChanged += (o, e) => NotifyPropertyChanged("ItemNames");
          }
          public ObservableCollection<Item> Items { get; private set; }
          public string ItemNames { get { return String.Join(",", Items); } }
    }
    

    【讨论】:

    • 如果类是使用 svcutil 创建的。我会在客户端生成只读吗?如果我从服务接收数据而不是在客户端生成数据怎么办。我会在哪里附加事件?
    • 被更改的集合也嵌套在另一个集合中。
    • 我通过设置一个接受其自己的类型作为参数的构造函数来使其工作,然后复制值并创建一个新的 ObservableCollection 并将 NotifyPropertyChanged 调用附加到您指定的 CollectionChanged 事件。字符串已更新。我只像这样使用构造函数一次,因此创建新集合是安全的。我不确定这是否是最有效的方法,但它正在起作用。还是谢谢你。
    【解决方案2】:

    是的,但通常你不想做这样的事情,因为开销太大。如果您使用带有ItemsSource 的控件,他们知道如何处理CollectionChanged 而无需重新创建所有内容。

    【讨论】:

    • 我将该属性绑定在 Grid 的 DataColumn 中,并使用 IValueConverter 将 ObservableCollection 转换为逗号分隔的字符串。我绝对知道这不是要走的路,因为我无法过滤等。我知道这可以作为我班级中的只读属性来完成我如何通知只读字符串属性自收集以来已更改变了吗?
    • @ChristopherLeach:只需订阅 CollectionChanged 事件并为保存字符串的属性触发 PropertyChanged 事件。
    • 唯一的问题是该类是从 WCF 服务生成的。我尝试使用只读字符串属性生成部分类客户端并附加 CollectionChanged 事件处理程序,但这不会在服务中序列化。我应该在一个新类中继承 WCF 类并链接那里的事件吗?
    • 被更改的集合也嵌套在另一个集合中。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2016-12-24
    相关资源
    最近更新 更多