我有以下两个类:
(1)IViewModelManager (2)WorkspaceViewModel
IViewModelManager有一个ObservableCollection。
将IViewModelManager注入到WorkspaceViewModel的构造函数中。
我有一个绑定到WorkspaceViewModel的View - 在视图中是一个需要绑定到WorkspaceViewModel中的集合的ListBox。如果我在WorkspaceViewModel中定义一个readonly属性,它返回IViewModelManager中的ObservableCollection - 对ObservableCollection的更改总是冒泡到UI吗?例如,如果我有另一个名为ViewModelManager的类,它派生自IViewModelManager - 我在ViewModelManager中执行一些向ObservableCollection添加项的函数,那么绑定到WorkspaceViewModel类的View中的ListBox会获取该更改吗?如果没有,任何关于如何使用我所描述的架构实现这一点的想法?
克里斯
答案 0 :(得分:2)
是的,更改将发送到UI。 ListBox
直接绑定到ObservableCollection
实例;它只使用绑定的属性路径来确定如何到达那里。
答案 1 :(得分:0)
在观点方面:
将Listbox的ItemsSource设置为可绑定属性,如下所示:
ItemsSource="{Binding Path=BindingName, Mode=OneWay}"
在视图模型侧:
宣布这样一个属性:
private ObservableCollection<T> _BindingName = new ObservableCollection<T>();
public ObservableCollection<T> BindingName {
get { return _BindingName; }
set {
_BindingName = value;
NotifyPropertyChanged("BindingName");
}
}
每次更改此属性时,都需要引发propertyChanged事件以使绑定反映UI中的更改。
答案 2 :(得分:0)
是的,请注意。如果您的IViewModelManager实例交换了ObservableCollection,您的View将不会注意到。例如:
public class VMMgr : IViewModelManager
{
private ObservableCollection _oc;
public ObservableCollection Collection { get { return _oc; } }
// other implementation
public void DoNaughtyThings()
{
_oc = new ObservableCollection();
}
}
如果有人来修改_oc以指向ObservableCollection的不同实例(例如调用DoNaughtyThings()),您的视图将不会注意到它已更改。
我对此的约定是让ViewModel继承自DependencyObject,并将View绑定的任何东西暴露为DependencyProperties。 YMMV,HTH。