我注意到,WPF中的ObservableCollection
仅通过添加或删除列表中的项目来反映GUI的更改,但不是通过编辑它。为什么ObservableCollection未更新项目更改?
这意味着我必须改写我的自定义类MyObservableCollection。 这种行为的原因是什么?
感谢
我注意到,WPF中的ObservableCollection
仅通过添加或删除列表中的项目来反映GUI的更改,但不是通过编辑它。为什么ObservableCollection未更新项目更改?
这意味着我必须改写我的自定义类MyObservableCollection。 这种行为的原因是什么?
感谢
的的ObservableCollection没有办法知道,如果你改变它包含的对象的方式 - 如果你希望收到这些对象时则改变你必须让这些物体观察到的,以及(例如让这些对象实现INotifyPropertyChanged)
可能是因为项目在编辑时没有办法警告集合 - 也就是说它们可能不可观察。其他类会有类似的行为 - 无法提醒您引用的类的图形中的每一个变化。
作为解决方法,您可以从集合中提取对象,然后在完成处理后重新插入它。不过,根据您的要求和并发模型,这可能会让程序变得丑陋。这是一个快速入门,不适合任何需要质量的东西。
相反,您可以使用专门触发ContentChanged(不确定名称)事件的更新方法来实现集合。这并不漂亮,但至少很容易处理。
理想情况下,正如kragen2uk所说,最好是让对象可观察并保持客户端代码清洁和简单。
另请参阅this question。
提取和重新插入是一个非常好的破解:)现在我知道我必须忘掉这个把戏:) – 2009-07-16 11:01:43
实现此目的的另一种方法是您将实现一个从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
看起来有趣,但我不明白你从DependencyObject继承什么目的?绑定到WPF内部的依赖属性应该足够..或者? – 2010-04-08 09:07:01
您可以在视图模型类中注册一个方法,以便在数据类对象的PropertyChanged事件中进行注册,并在数据对象的属性发生任何更改时在View模型中侦听它们。当可观察集合的项目发生更改时,这是在View模型中进行控制的非常简单直接的方法。希望这有助于...
好吧。我实现了INotifyPorpertyChanged接口。谢谢 – 2009-07-16 11:02:57