2013-09-27 76 views
4

我有以下方式設置類結構 - 當模型屬性發生變化時,RaisePropertyChanged事件不會被調用。無論如何還是需要將ViewModel中的複雜屬性展平?當子屬性更改時觸發RaisePropertyChanged - MvvmCross

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

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

Class Service 
{ 

} 
+0

你的意思是當模型實例的屬性「A」被改變時,模型RaisePropertyChanged沒有被觸發? –

回答

7

我不認爲有任何簡單的方法。


要麼你可以改變模型,所以它支持INotifyPropertyChanged - 例如,

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

我用第一種方法,當我用一個計算器庫 - 其中有模型實體,如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類的控制權時,我已經使用了這種方法 - 當它被授予給我時。


...或作爲方法的擴展,您可以拼合屬性到父視圖模型:

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); } 
    } 
} 

我用這個方法只剛好有一對夫婦屬性擔心。


總體......記住,視圖模型是有成爲Model of the View - 這是確定的屬性值從模型對象複製到/。

+0

謝謝Stuart!我希望有一個神奇的MvvmCross銀子彈來解決這個問題! :) – Brenton

+0

如果只是語法障礙,那麼考慮Fody - http://twincoders.com/blog/codigo-limpio-con-fody/ - 或者Rio - http://slodge.blogspot.co .UK/2013/07/N36-RIO結合-carnival.html – Stuart

相關問題