7

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

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

谢谢

4

5 回答 5

12

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

于 2009-07-16T09:37:55.100 回答
1

实现这一点的另一种方法是实现一个派生自 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 数据绑定

布拉萨戈拉

于 2010-04-08T04:15:43.033 回答
1

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

于 2011-08-31T05:58:18.267 回答
0

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

于 2009-07-16T09:40:29.930 回答
0

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

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

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

另见这个问题

于 2009-07-16T09:47:49.370 回答