更改子属性时触发RaisePropertyChanged - MvvmCross

时间:2013-09-27 22:28:50

标签: c# mvvm mvvmcross

我有以下方式设置类结构 - 当Model的属性被更改时,不会调用RaisePropertyChanged事件。反正有这个或者我是否需要在ViewModel中展平复杂属性?

Class ViewModel
{
   public Model model {
                   get { return _Service.GetModel();}
                   set { _Service.SetModel(); RaisePropertyChanged(() => Model);
                  }
} 

class Model
{
   public string A {get;set;}
}

Class Service
{

}

1 个答案:

答案 0 :(得分:7)

我认为没有任何简单的方法。


您可以更改模型,使其支持INotifyPropertyChanged - 例如

class Model : MvxNotifyPropertyChanged
{
   public string A { 
        get { return _a; } 
        set { _a = value; RaisePropertyChanged(() => A); }
   }
}

当我使用stackoverflow库时,我已经使用了第一种方法 - 它具有像http://stacky.codeplex.com/SourceControl/latest#trunk/source/Stacky/Entities/Answer.cs这样的模型实体


...或者您可以使用另一个INotifyPropertyChanged类包装您的模型:

class ModelWrapper : MvxNotifyPropertyChanged
{
   private readonly Model _m;
   public ModelWrapper(Model m) 
    { _m = m; }

   public string A { 
        get { return _m.A; } 
        set { _m.A = value; RaisePropertyChanged(() => A); }
   }
}

当我没有对Model类的任何控制时 - 我已经使用了这种方法 - 当它被提供给我时。


...或者作为该方法的扩展,您可以将属性展平为父ViewModel:

class MyViewModel : MvxViewModel
{
   private readonly Model _m;
   public ModelWrapper(Model m) 
    { _m = m; }

   public string A { 
        get { return _m.A; } 
        set { _m.A = value; RaisePropertyChanged(() => A); }
   }
}

我只在需要担心几个属性时才使用这种方法。


总体而言......请记住ViewModel是Model of the View - 可以将属性值复制到Model对象中,也可以从Model对象复制。