【问题标题】:ObservableCollection not working at allObservableCollection 根本不起作用
【发布时间】:2014-10-22 13:01:56
【问题描述】:

我有这段代码:

private ObservableCollection<Stats> _stats;

public StatisticsViewModel()
{
    Stats = new ObservableCollection<Stats>();
    Stats.Add(new Stats() { Type = "Min", Price = 100, Legend = Legend.Default });
}

public ObservableCollection<Stats> Stats
{
    get 
    { 
        return _stats; 
    }
    set
    {
        if (_stats != value)
        {
            _stats = value;
            RaisePropertyChanged("Stats");
        }
    }
}

创建新集合时,会调用 Stats 集。但是,在添加对象时,它没有,因此它不执行 RaisePropertyChanged...

我可以做些什么来解决这个问题?

【问题讨论】:

  • 嗯,您可以为 Stats 集合的 CollectionChanged 事件注册一个处理程序,并每次调用RaisePropertyChanged()。但你真的需要它吗?
  • 工作正常,向集合中添加项目不会调用 setter,您实际上是在 getter 返回的集合上调用 Add()。如果您想在集合中添加或删除项目时执行某些操作,请挂接到 CollectionChanged 事件
  • 或者更简单地说:如果属性没有改变,为什么会引发PropertyChanged
  • 您是否尝试过将该属性绑定到某些 ItemsControl 的 ItemsSource?当只有一些项目添加到集合中时,我不认为提高 propertychanged 是必须做的。
  • ObservableCollection&lt;T&gt; 不会在其父对象上引发 PropertyChanged 事件。当添加或删除某些内容时,它会在自身上引发 CollectionChanged 事件。 WPF 知道ObservableCollection&lt;T&gt;CollectionChanged 事件,因此它可以像PropertyChanged 一样用于绑定类似于。但它们并不相同。

标签: c# wpf mvvm


【解决方案1】:

创建新集合时,调用 Stats 集。

正确。这是因为代码正在设置Stats 属性,该属性调用了setter 方法。

但是,当添加对象时,它没有,因此它不执行 RaisePropertyChanged

也正确。在对象上调用.Add 时,代码不是设置 包含该对象的属性。所以没有理由调用 setter 方法。在这种情况下,Stats 属性 本身 不会被更改,您只是在与对象交互。

我可以做些什么来解决这个问题?

您可以订阅的ObservableCollectionexposes two eventsCollectionChanged 事件在集合本身发生变化时引发,PropertyChanged 事件在集合上的属性值发生变化时引发。

例如,如果你想在集合发生变化时处理事件,你可以订阅那个事件:

Stats.CollectionChanged += CollectionChangeHandler;

// elsewhere...

private void CollectionChangeHandler(object sender, NotifyCollectionChangedEventArgs e)
{
    // do something to respond to the changed collection
}

【讨论】:

  • 但是添加项目时我应该如何更新 UI?
  • @Bv202:那么,您想要对 UI 做什么?如果您想手动执行更新,那么您可以在 CollectionChangeHandler 方法中执行此操作。不过,WPF 会自动订阅 ObservableCollection 事件,因此如果相应地使用,它将自动更新。
猜你喜欢
  • 2018-08-04
  • 2011-06-25
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多