4

我通过以下方式设置了类结构 - 当模型的属性发生更改时,不会调用 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
{

}
4

1 回答 1

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- 可以将属性值复制到模型对象/从模型对象复制。

于 2013-09-27T22:43:10.237 回答