我一直在使用MVVM,并想知道如何使用ObservableCollection 绑定到TwoWay中的ItemsSource?
例如,我有一个名为SmartDraw的自定义绘图UserControl,其中ItemsSource引用自定义图形列表,它被绑定到视图模型中的ObservableCollection图形。
如果我在视图模型中添加CustomGraphic,SmartDraw中的ItemsSource将知道添加了CustomGraphic,然后执行其他一些函数调用。这是正常的。
然而,SmartDraw也是一个Canvas,它允许用户使用鼠标在其上绘制图形。 CustomGraphic的数量将根据用户绘图而变化。那么,我怎么知道UI(SmartDraw)改变了ObservableCollection?
这是我的代码:
视图模型:
public ObservableCollection<CustomGraphic> Graphics { get; set; }
非常感谢你。
答案 0 :(得分:0)
不确定这是否可以回答您的问题...但是,您可以通过以下方式跟踪对可观察集合的更改。
要检测对可观察集合的更改(而不是对集合中项目属性的更改),请订阅CollectionChanged
的{{1}}事件。
ObservableCollection
如果您需要跟踪集合中对象的更改,则必须构建一个扩展的private ObservableCollection<ViewModel> _collection;
public ObservableCollection<ViewModel> Collection {
get { return _collection; }
set {
if (_collection != value) {
// de-register on collection changed
if (_collection != null)
_collection.CollectionChanged -= this.Collection_CollectionChanged;
_collection = value;
// re-register on collection changed
if (_collection != null)
_collection.CollectionChanged += this.Collection_CollectionChanged;
}
}
private void Collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
switch (e.Action) {
case NotifyCollectionChangedAction.Add:
// e.NewItems contains the added items
break;
case NotifyCollectionChangedAction.Remove:
// e.OldItems contains the removed items
break;
case NotifyCollectionChangedAction.Replace:
// e.NewItems contains the new items,
// e.OldItems contains the removed items
break;
case NotifyCollectionChangedAction.Reset:
// the collection has been cleared
break;
}
}
订阅项目的ObservableCollection
事件,然后在其中一个属性具有事件时引发事件改变。
PropertyChanged