Xamarin:给我一些关于MVVM的澄清

时间:2016-08-30 21:56:28

标签: mvvm xamarin viewmodel

我对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:如果我可以在View的隐藏代码类中保存TestingViewModel对象,为什么必须将它传递给BindingContext?

以下一行:

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

问题2:Strokes是笔画对象的集合。做笔画   也是一个ViewModel。

1 个答案:

答案 0 :(得分:0)

MVVM的理念是将创建视图和业务逻辑之间的关注分开。

ViewModel将管理您的业务逻辑,包括PropertiesCommandsRelyCommands的实现,您稍后会将其绑定到您的视图中。很简单,您将不会有任何代码在你对最佳案例的看法中。

为了更好地理解这种模式,我建议你阅读这个msdn链接,它将向你说明如何重新构造代码以便更好地使用以及使用MVVM有什么好处