当子属性发生变化时触发RaisePropertyChanged - MvvmCross

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
{

}

当模型实例的属性A被改变时,你的意思是model.RaisePropertyChanged事件没有被触发? - Jeroen van Langen
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); }
   }
}

当我无法控制模型类或者该类是被提供给我的时候,我会使用这个方法。


或者,延伸这个方法,你可以将属性压缩到父级视图模型中:

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存在是为了成为View的模型 - 将属性值复制到/从模型对象中是可以的。


谢谢 Stuart!我一直希望有一种神奇的 MvvmCross 银弹来解决这个问题! :) - Brenton
如果只是语法方面的问题,那么考虑使用Fody - http://twincoders.com/blog/codigo-limpio-con-fody/ 或 Rio - http://slodge.blogspot.co.uk/2013/07/n36-rio-binding-carnival.html - Stuart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接