我注意到WPF中的ObservableCollection
仅通过添加或删除列表中的项目而不是通过编辑来反映GUI中的更改。
这意味着我必须编写自定义类MyObservableCollection。 这种行为的原因是什么?
由于
答案 0 :(得分:12)
ObservableCollection无法知道您是否对其包含的对象进行了更改 - 如果您希望在这些对象发生更改时得到通知,那么您也必须使这些对象可观察(例如,让这些对象实现INotifyPropertyChanged)
答案 1 :(得分: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数据绑定
BR sargola
答案 2 :(得分:1)
您可以在视图模型类中注册数据类对象的PropertyChanged事件中的方法,并在数据对象的属性发生任何更改时在View模型中侦听它们。当可观察集合的项目发生更改时,这是在View模型中拥有控件的非常简单直接的方法。希望这会有所帮助...
答案 3 :(得分:0)
可能是因为项目在编辑时无法提醒集合 - 即它们可能无法被观察到。其他类也会有类似的行为 - 无法提醒您引用类的图形中的每个更改。
答案 4 :(得分:0)
作为解决方法,您可以从集合中提取对象,然后在完成处理后重新插入它。根据您的要求和并发模型,这可能只会使程序变得丑陋。这是一个快速入侵,并不适合任何需要质量的东西。
相反,您可以使用专门触发ContentChanged(不确定名称)事件的更新方法来实现集合。它并不漂亮,但它至少很容易处理。
理想情况下,正如kragen2uk所说,最好使对象可观察并保持客户端代码干净简单。