2011-11-20 14 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最终做了更多的包装和适应视图,但这两种方法都不好。