2014-02-14 84 views
4

當不可觀察時綁定對象的列表屬性是否有最佳實踐方法?例如,如果我們有:當屬性不​​可觀察時綁定

public class Band 
{ 
    public string Name { get; set; } 
    public List<Musician> Members { get; private set; } 
    // other properties here 
} 

如果我的視圖模型具有Band財產,我想我的UI綁定到Members財產,如何在用戶界面上顯示更新到Members財產?成員不可觀察。

目前的想法是創建一個DTO,它是Band類的精確副本,但是使MembersObservableCollection。然後UI將綁定到這個DTO。在視圖模型關閉之前,它會將DTO映射回適當的Band類。這似乎是一個開銷。有沒有更好的辦法?

編輯 - 另一種選擇

我只是進行了座談,在人,用別人這件事。這個想法是在視圖模型上添加一個ObservableCollection屬性。然後,在視圖模型的構造函數中,使用實體來填充ObservableCollection。用戶完成編輯後,使用更新的ObservableCollection重置實體上的List

+0

我打算建議在ViewModel中放置可觀察屬性,但是從編輯中可以看出,您已經在實現這一目標。畢竟,ViewModel是爲了模型化視圖,所以應該在可觀察的屬性在一個完美的MVVM世界:) – Rachel

回答

2

正如您所提到的,您可以使用ObservableCollection。您也可以使用BindingList

如果你不想去的路線,另一個另一種選擇我看到的是使Band實施INotifyPropertyChanged,然後用你的財產Members調用namePropertyChanged。這將告訴消費者控制該列表已更新並自行刷新。

與該路線相關的問題是,嘗試和計算何時調用PropertyChanged事件的難度可能比僅將您的集合更改爲ObservableCollection<T>BindingList<T>更痛苦。

最後一種選擇是在每次您認爲更改或者控件支持時重新綁定集合,請調用可用的Refresh方法。某處某處必須告訴控制系統,因爲它們不會定期檢查,所以系統會發生變化。

因爲您將此標記爲MVVM,所以您的視圖應該有BandViewModel和ObservableCollection爲MemberViewModel s。 ViewModel中的所有內容都應該是可綁定的,並在發生更改時發送通知。

+0

也有一個選項可以在默認視圖中調用Refresh。 (即'CollectionViewSource.GetDefaultView(Members).Refresh()') – zahir

+0

@zahir真。我會更新我的答案也反映了這一點。 – TyCobb

+0

如果我做了您的第一個建議(ObservableCollection或BindingList),那意味着更改我的域實體以遵守UI需求,所以我寧願不這樣做。現在檢查其餘的。 –

0

你的編輯讓問題更加混亂。回答爲什麼應該使用ObservableCollection。

當你想讓你的UI觀察這個集合時,你應該使用ObservableCollection。我的意思是,當你希望修改這個集合(不是在談論這個集合中的項目,而是整個集合)。如果你希望添加/刪除/排序/過濾這個集合...如果沒有這些操作是預期的,那麼你也很好地綁定到IEnumerable!

另請注意,基礎項目中的屬性被修改與你如何將集合綁定爲(IEnumerable或Observable)無關。如果基礎類型引發適當的通知更改事件(並實現INotifyPropertyChanged),則會反映(或不反映)基礎項目屬性的更新。

希望有幫助!