为什么ObservableCollection在项目更改时没有更新?

7
我注意到在WPF中,ObservableCollection 只有在添加或删除列表项时才会反映GUI中的更改,而不是通过编辑。这意味着我必须编写自定义类MyObservableCollection。这种行为的原因是什么?谢谢。
5个回答

12

ObservableCollection无法知道您对其包含的对象所做的更改-如果您希望在这些对象更改时得到通知,则必须使这些对象也能够被观察(例如,通过让这些对象实现INotifyPropertyChanged接口)。


好的,我实现了INotifyPropertyChanged接口。谢谢。 - theSpyCry

1

另一种实现这个的方法是,您可以实现一个新的XXXViewModel类,该类派生自DependencyObject,并将其放入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 的数据绑定
sargola

看起来很有趣,但我不明白为什么要从DependencyObject继承?类内绑定到WPF的依赖属性应该足够了,是吗? - theSpyCry
@PaN1C_Showt1Me:GetValue/SetValue在那里实现了。br Sargola - Sargola
啊,好的。UserControl 也是一个 DependencyObject.. 没注意到这一点。谢谢。 - theSpyCry

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

0

可能是因为项目没有办法在编辑时向集合发出警报 - 即它们可能不可观察。其他类也会有类似的行为 - 没有办法提醒您关注所引用类的图形中的每个更改。


0

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

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

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

另请参见this question


提取和重新插入是一个非常好的技巧 :) 现在我知道我必须忘记这个技巧 :) - theSpyCry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接