2013-07-22 86 views
2

說我有這個域實體:綁定IEnumerable的MVVM屬性的正確方法,是不是可觀察集合

public class Foo 
{ 
    public string Name { get; set; } 
    public IEnumerable<Bar> Bars { get; set; } 
} 

現在,讓我們說,我需要將Bars屬性綁定到一個WPF/MVVM應用一個DataGrid 。通知視圖Bars屬性更改的適當方式是什麼?我看到幾個選項:

  1. 變更條是一個ObservableCollection
  2. 創建一個新的屬性,在視圖模型,這是一個ObservableCollection那纔是真正的酒吧的副本。
  3. 刷新整個視圖
  4. 其他/更好?

我可以做#1,但我不喜歡視圖的需要導致域實體改變。

2號似乎確定,但有點hackish。

3號似乎效率低下。

最好的方法是什麼?

編輯

爲完整的基礎上,西蒙的回答,我這樣做:

public Foo SelectedFoo 
    { 
     get { return _selectedFoo; } 
     set 
     { 
      _selectedFoo = value; 
      this.NotifyPropertyChanged(() => this.Foo); 

      _bars = new ObservableCollection<Bar>(); 
      if (_selectedFoo.Bars != null) { _bars.AddRange(_selectedFoo.Bars); } 
      this.NotifyPropertyChanged(() => this.Bars); 
     } 
    } 

    private ObservableCollection<Bar> _bars; 

    public ObservableCollection<Bar> Bars 
    { 
     get { return _bars; } 
    } 
+0

如果您知道它何時發生變化,請在此處提出PropertyChanged(「酒吧」)。如果不是,n.2是正確的選項。 –

+0

我發佈這個問題之前實際上已經嘗試過了,但沒有奏效。也許我還有其他的錯誤... –

+0

我實際上爲'Foo'和'Bar'創建了一個單獨的視圖模型,並使用這些視圖模型... –

回答

4

在最佳實踐一種-的路,你的觀點不應該直接綁定到你的模型:這就是你的視圖模型的用途。理想情況下,您需要#2以實現最大分離,並在適當時將邏輯同步到模型。

相關問題