2016-08-30 39 views
0

我對MVVM沒有很好的理解,並且閱讀了其他頁面上的一些文章。Xamarin:給我一些MVVM的說明

ViewModel是否執行所有業務邏輯並與數據模型進行交互,然後將數據發送到視圖進行演示。

在View上,只會有直接關聯UI的功能。

這是我的代碼,我有一些代碼,但不知道是不是這樣做

 private TestingViewModel Model 
    { 
     get 
     { 
      return BindingContext as TestingViewModel; 
     } 
    } 

    public TestingPage() 
    { 
     InitializeComponent(); 

     BindingContext = new TestingViewModel(); 
     Model.PropertyChanged += TestingPropertyChanged; 

     NavigationPage.SetHasNavigationBar(this, false); 
     NavigationPage.SetHasBackButton(this, false); 

     MediaFactory.ClearAllCachedMedia(); 
     SetupTappedControl(); 
    } 

    private void TestingPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName.Equals("ActivePage")) 
     { 
      if (Model.ActivePage != null) 
      { 
       Device.BeginInvokeOnMainThread(async() => 
       { 
        var path = await MediaFactory.GetImagePathAsync(Model.ActivePage.DocumentId + "_" + Model.ActivePage.PageNumber); 

        CanvasView.Strokes = Model.ActivePage.Strokes; 
        CanvasView.LoadBitmapInMemory(path, Model.ActivePage.Width, Model.ActivePage.Height); 
       }); 
      } 
     } 
    } 

    #region File Button Selected 

    public void TapFileOpen(object sender, EventArgs e) 
    { 
     Task.Run(() => 
     { 
      var pickFileTask = CrossFilePicker.Current.PickFile(); 
      var data = pickFileTask.Result; 
      Model.OpenDocument(data.FileName, data.DataArray); 
     }); 

    } 

問題1的正確方法是:爲什麼我必須把它傳遞給的BindingContext如果我可以抱TestingViewModel對象在View的Code-behind類中?

的下面行:

    CanvasView.Strokes = Model.ActivePage.Strokes; 
        CanvasView.LoadBitmapInMemory(path, Model.ActivePage.Width, Model.ActivePage.Height); 

問2:筆畫是中風的對象的集合。做筆畫 也是一個ViewModel。

回答

0

MVVM的想法是在創建視圖和業務邏輯之間區分關注點。

視圖模型將管理自己的業務邏輯,包括執行PropertiesCommandsRelyCommands,你將稍後將它綁定到您的看法,就這麼簡單,你不會有任何代碼後面在最好的情況下您的看法。

對於這種模式的更好的理解,我建議你讀這msdn鏈接,將說明取決於你如何能重新構造您更好地利用代碼,什麼是使用MVVM

好處