2016-08-30 41 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

好处