【问题标题】:Why ObservableCollection is not updated on items change?为什么 ObservableCollection 不会在项目更改时更新?
【发布时间】:2009-07-16 09:34:23
【问题描述】:

我注意到 WPF 中的 ObservableCollection 仅通过添加或删除列表中的项目而不是通过编辑它来反映 GUI 中的更改。

这意味着我必须改写我的自定义类 MyObservableCollection。 这种行为的原因是什么?

谢谢

【问题讨论】:

    标签: wpf observablecollection


    【解决方案1】:

    ObservableCollection 无法知道您是否对其包含的对象进行了更改 - 如果您想在这些对象更改时收到通知,那么您必须使这些对象也可观察(例如通过让这些对象实现 INotifyPropertyChanged)

    【讨论】:

    • 那么好。我实现了 INotifyPorpertyChanged 接口。谢谢
    【解决方案2】:

    实现此目的的另一种方法是实现一个派生自 DependencyObject 的新 XXXViewModel 类,并将其放入 ObservableCollection。

    为此看看这个非常好的MVVM介绍:http://blog.lab49.com/archives/2650

    这样一个类的例子是:

    public class EntryViewModel : DependencyObject
    {
        private Entry _entry;
        public EntryViewModel(Entry e)
        {
            _entry = e;
            SetProperties(e);
        }
    
        private void SetProperties(Entry value)
        {
    
            this.Id = value.Id;
            this.Title = value.Title;
            this.CreationTimestamp = value.CreationTimestamp;
            this.LastUpdateTimestamp = value.LastUpdateTimestamp;
            this.Flag = value.Flag;
            this.Body = value.Body;
        }
    
    
        public Entry Entry
        {
            get {
                SyncBackProperties();
                return this._entry;
            }
        }
    
    
        public Int64 Id
        {
            get { return (Int64)GetValue(IdProperty); }
            set { SetValue(IdProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for Id.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IdProperty =
            DependencyProperty.Register("Id", typeof(Int64), typeof(EntryViewModel), new UIPropertyMetadata(new Int64()));
    
    }}
    

    这里很重要: - 它派生自 DependencyObject - 它与 DependencyProperties 一起运行以支持 WPF 数据绑定

    br 萨戈拉

    【讨论】:

    • 看起来很有趣,但我不明白你从 DependencyObject 继承的目的是什么?类内部绑定到 WPF 的依赖属性应该足够了.. 还是?
    • @PaN1C_Showt1Me:GetValue/SetValue 在那里实现。 br 萨戈拉
    • 啊好吧.. UserControl 也是一个 DependencyObject.. 没注意到。谢谢
    【解决方案3】:

    您可以在数据类对象的PropertyChanged事件的视图模型类中注册一个方法,并在数据对象的属性发生任何变化时在视图模型中监听它们。当可观察集合的项目发生变化时,这是在 View 模型中进行控制的非常简单直接的方法。希望这会有所帮助...

    【讨论】:

      【解决方案4】:

      可能是因为项目在编辑时无法提醒集合 - 即它们可能无法观察。其他类也会有类似的行为 - 无法提醒您引用类图的每一个变化。

      【讨论】:

        【解决方案5】:

        作为一种变通方法,您可以从集合中提取对象,然后在完成处理后重新插入它。但是,根据您的要求和并发模型,这可能会使程序变得丑陋。这是一个快速破解,不适合任何需要质量的东西。

        相反,您可以使用专门触发 ContentChanged(不确定名称)事件的更新方法来实现集合。它不漂亮,但至少很容易处理。

        理想情况下,正如 kragen2uk 所说,最好让对象可观察并保持客户端代码简洁明了。

        另见this question

        【讨论】:

        • 提取和重新插入是一个非常好的技巧 :) 现在我知道我必须忘记这个技巧 :)
        猜你喜欢
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多