更改子属性时触发RaisePropertyChanged - MvvmCross

Bre*_*ton 4 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
{

}
Run Code Online (Sandbox Code Playgroud)

Stu*_*art 7

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


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

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

当我使用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); }
   }
}
Run Code Online (Sandbox Code Playgroud)

当我对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); }
   }
}
Run Code Online (Sandbox Code Playgroud)

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


总的来说......请记住,ViewModel是可以的Model of the View- 可以将属性值复制到Model对象中/从Model对象复制属性值.