2015-12-30 61 views
3

有人能解釋MVVM框架(如ReactiveUI或MVVM Light)爲Xamarin.Forms應用程序提供了什麼好處?我們可以在我們的視圖模型中實現INotifyPropertyChanged而不使用任何這些框架。 我錯過了什麼嗎?Xamarin.Forms的MVVM框架

+1

如果INotifyPropertyChanged是你所需要的,那麼這對你有好處。這些框架通常會帶來一些漂亮的工具,如DI,自動加載/綁定等等。他們只是讓生活變得更輕鬆。 –

回答

1

除了INotifyPropertyChanged之外,MVVM框架還有更多。僅舉幾個例子有:

  • RelayCommand - 可以提供ICommand接口的實現,讓您的委託綁定到視圖類。有用的按鈕
  • EventToCommand - 這允許您將事件綁定到視圖模型中的命令。而不必背後使用代碼爲UIElement Events

這些都是由MVVM框架等是作爲MVVMLight

,通過這意味着你不必在每一個項目實施INotifyPropertyChanged使用MVVMLight只有兩個班您只需確保ViewModel繼承自ViewModelBase,並且您也不必在上述兩個類的每個項目中編寫自己的實現。

最後要提的是,您還可以安裝MVVMLight的代碼片段。這意味着編寫代碼的速度會更快!

例如,如果您想要引發屬性更改的屬性,請使用mvvmlight屬性片段。同樣,如果你想RelayCommand財產,你可以只使用mvvmlight RelayCommand片段

2

我是Xamarin.Forms(https://github.com/daniel-luberda/DLToolkit.PageFactory)的小型MVVM框架的作者。我會嘗試點使用它的一些優勢,因爲一些功能的其他框架是常見的太:

  • 準備使用INotifyPropertyChanged實施
  • 視圖模型面向導航(剛從BaseViewModelBaseModel繼承)(你可以將您的導航邏輯,查看型號)
  • 內置短信輕鬆通過
  • 頁面或視圖模型之間的數據/參數頁面緩存和重用(更好的用戶界面體驗的意見/頁重複使用)
  • 每個頁面都有權訪問鍵入的ViewModel實例,該實例會自動實例化並連接到BindingContext

這些功能因庫而異。一些更先進的MVVM框架爲您提供了將整個項目移動到不同平臺/ sdks的可能性,因爲它們具有多平臺支持。對於大型項目來說這可能是一筆不錯的交易。

示例代碼示出一些特徵(該碼從一個ViewModel調用):

PageFactory.GetPageFromCache<SecondPageModel>() 
    .ResetPageModel() 
    .SendActionToPageModel((model) => { model.Message = "Hello World!"; }) 
    .PushPage(); 
0

的模型 - 視圖 - 模型(MVVM)建築圖案記與XAML發明的。該模式通過一個充當View和Model(ViewModel)之間中介的類來強制XAML用戶界面(View)與底層數據(Model)分離。 View和ViewModel通常通過XAML文件中定義的數據綁定進行連接。 View的BindingContext通常是ViewModel的一個實例。 Please click here to see more details and sample code.

你不需要使用ReactiveUI或者MVVM Light,你可以直接使用INotifyPropertyChanged接口來通知客戶端屬性值已經改變了。下面,你可以看到我的ViewModelBase類的代碼,希望這可以幫助你;

public class ViewModelBase : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 

在這裏我的ViewModel是我從ViewModelBase如何繼承和我如何創建我的財產;

public class ImageButtonViewModel : ViewModelBase 
{ 
// ... 
private string header; 
public string Header 
{ 
     get 
     { 
      return header; 
     } 
     set 
     { 
      header = value; 
      OnPropertyChanged(); 
     } 
    } 
// ... 
} 
0

我一直與Askaiser.Mobile.Pillar巨大的成功使用,我看不出有什麼不對,我仍然在調查,但是這已經成爲我的項目的最佳人選。 Doc

我希望我能幫上忙。

問候