2011-11-20 100 views
0

如果我的模型實現INotifyPropertyChanged並且我的虛擬機需要?如果支持VM的道具的每個字段實現INotifyPropChange,虛擬機是否需要實現INotifyPropChagned?

說明:在實際情況下,您有SomeOtherProp然後INotifyPropertyChanged絕對需要實施。我真正追求的是我需要做多少工作(複製)以形成良好的模型。

例子:

namespace Question 
{ 
    public interface IFoo : INotifyPropertyChanged { } 
    public interface IBar : INotifyPropertyChanged { } 

    public interface IModel : INotifyPropertyChanged 
    { 
     IFoo Foo { get; set; } 
     ObservableCollection<IBar> BarCollection { get; } 
    } 

    public class VM : TypeSafeViewModelBase 
    //Clarification: added VM base clase with typesafe override for RaisePropertyChanged 
    { 
     private IModel _model; 
     public VM(IModel model) 
     { 
      this._model = model; 
      //Clarification: added this call... 
      this._model.PropertyChanged += (sender, args) => base.RaisePropertyChanged(args.PropertyName); 
      //That is the one I have questions about and ultimateley what I want to avoid 
     } 

     public IFoo Foo { get { return this._model.Foo; } } 
     public ObservableCollection<IBar> BarCollection { get { return this._model.BarCollection; } } 

     //clarification: added this prop declaration 
     //I know this would be needed as this property is backed by a private member of this class 
     private string _someOtherProp; 
     public string SomeOtherProp 
     { 
      get { return this._someOtherProp; } 
      set 
      { 
       this._someOtherProp = value; 
       base.RaisePropertyChanged(() => this.SomeOtherProp); 
      } 
     } 
    } 
} 

確實VM需要執行INotifyPropertyChanged?並把所有的事件轉交給V?或者將V中的事物綁定到實現PropertyChanged和CollectionChanged接口的最低級別的對象上?

我似乎無法找到我多少膠水代碼需要寫,如果我有一個良好的,通知模型層一個明確的答案......

PS。如果有問題,我正在使用Prism和Ninject開發SL4。我的模型是可變的,有狀態的,並且在本地內存中(我保留了一個本地緩存,因爲在每次操作都不可行之後點擊服務器)。

+0

我認爲你在ViewModel中沒有任何視圖狀態,並且你的模型使用INotifyXXX機制,那麼你不需要'ViewModel',因爲它根本不是一個真正的ViewModel。 –

+0

@RitchMelton,同意,我的例子太簡單了。看到澄清的例子。 VM現在具有狀態(例如,認爲IsVisible,InitialPosition或類似的東西)。我的生產虛擬機跟蹤V狀態,並保證中間層。 – dFlat

回答

2

不,你不需要在你的情況下實現接口本身。例如,如果您使用RIA服務業務對象,則VM不需要實施INotifyPropertyChange,因爲那些已經實施了它。

但是!很可能你仍然想這樣做,因爲像「IsBusy」,「CanSave」等屬性通常屬於虛擬機本身,然後你需要接口。

通常每個應用程序都有一些類型爲VMBase的對象,它們實現了INotifyPropertyChangedINotifyDataErrorInfo等等。並且每個虛擬機從這個基類繼承

+0

好點。我已經闡明瞭這個例子更能代表產品代碼。我正在使用在MVVMLight中擴展ViewModelBase的基類。 – dFlat

+0

MVVMLight和所有其他MVVM框架至少實現INotifyPropertyChanged功能:)所以,你很好。無需實現它 - 您已經通過MVVMLight獲得了它 – katit

1

對於實現和維護任何抽象都有一定的代價,而在MVVM的情況下,有相當多的膠合代碼是不可避免的。要問的問題不是膠水代碼是否合適,而是抽象本身是否合適?你有沒有在你的viewmodels重用?你在大量使用數據綁定嗎?單元測試你的視圖模型是你的團隊做的事情嗎?還是將視圖模型集成到開發週期的一部分?

要專門回答你的問題,在你的設計中,模型通過實現INotifyPropertyChanged並提供可觀察的集合來爲視圖模型做一些工作。我喜歡儘可能多地使用基本語言和庫來實現我的模型。這意味着我的集合將是通用列表,哈希集等等,而我的事件機制將涉及自定義事件和委託(作爲事件聚合器實現)。

我的viewmodel最終做了更多的包裝和適應視圖,但這兩種方法都不好。