通过构造函数注入的ObservableCollection - 对集合的更改通知?

时间:2010-10-13 19:35:41

标签: c# dependency-injection dependencies

我有以下两个类:

(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会获取该更改吗?如果没有,任何关于如何使用我所描述的架构实现这一点的想法?

克里斯

3 个答案:

答案 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。