2010-10-13 18 views
1

我有以下兩類:ObservableCollection通過構造函數注入 - 對收集的更改通知?

(1)IViewModelManager (2)WorkspaceViewModel

IViewModelManager具有一個ObservableCollection。

IViewModelManager注入WorkspaceViewModel的構造。

我有一個觀點,即結合WorkspaceViewModel - 並在視圖中是需要綁定到WorkspaceViewModel集合的列表框。如果我定義WorkspaceViewModel,返回的ObservableCollection在IViewModelManager一個只讀屬性 - 將更改的ObservableCollection總是泡到用戶界面?舉例來說,如果我有一個名爲ViewModelManager另一個類,從IViewModelManager派生 - 我執行ViewModelManager一些功能,增加了一個項目的的ObservableCollection,將在視圖結合到WorkspaceViewModel類ListBox中拿起變化?如果沒有,關於如何使用我描述的體系結構實現這一點的任何想法?

克里斯

回答

2

是,這些更改將被髮送到用戶界面。 ListBox直接綁定到ObservableCollection實例;它只使用綁定的屬性路徑來確定如何到達那裏。

+0

對於實現INotifyPropertyChange的基礎屬性是否也是如此? V會直接綁定,還是需要粘貼代碼來將事件中繼到V? – dFlat 2011-11-18 05:02:42

+1

@dFlat:是的,依賴項屬性系統將使用您綁定的任何對象的'INotifyPropertyChanged'實現。 – 2011-11-18 14:01:24

0

在觀察側:

列表框的設置的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"); 
     } 
    } 

每次你改變這個屬性,你需要引發prope rtyChanged Event使綁定反映UI中的更改。

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。

相關問題