实践Xamarin的MVVM

从VB 开始,我已经习惯于事件驱动的编程模式了,这种模式中前端界面代码分为两部分:包含控件和布局的Form(Winform,WPF,Xamarin),和与之对应的后台代码(codebehind),后台代码包含响应前端控件的事件函数和初始化前端界面。这种方式很直接,易于理解,问题是方便进行单元测试,于是MVVM产生了。MVVM的实现仍然依赖于实现模型(这里的模型基本上是布局-后台代码),也就是完全实现MVVM需要实现模型的改进。支持WPF和Xamarin的XAML有了很大的改进,在编程模型上,支持MVVM的实现。同时,也可以按照传统的事件响应模式进行编程。在ASP.net上,对MVVM支持最好的应该是ASP.net core的RazorPage页面。

MVVM模式的介绍可以参见:
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/mvvm
MVVM的来历可以参见:
https://msdn.microsoft.com/en-us/magazine/dd419663.aspx

理想的MVVM实现中,View只与ViewModel打交道,不管是获取数据(通过绑定),还是执行命令(通过Command),页面的后台代码在这里应该只负责页面的初始化和绑定页面的上下文,不响应界面的事件,也不填充页面的数据。

我使用Xamarin编写了一个简单的猜五言唐诗的游戏,其中使用MVVM进行前端的设计。

前端界面代码:




    
        
        



在后台代码中,只负责初始化和绑定VM:

namespace GuessPoem
{
    public partial class MainPage : ContentPage
    {
      
        private GuessPoemViewModel viewModel;
        public MainPage()
        {
            InitializeComponent();
           
            viewModel = new GuessPoemViewModel(myGrid);
            BindingContext = viewModel;
            viewModel.NewGame();
        }

      
    }
}

View Model:

using GuessPoem.Application;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Input;
using Xamarin.Forms;

namespace GuessPoem.ViewModel
{
    public class GuessPoemViewModel:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        /// 
        /// 新游戏命令
        /// 
        public ICommand NewCommand { private set; get; }
        /// 
        /// 提交命令
        /// 
        public ICommand SubmitCommand { private set; get; }
        /// 
        /// 撤销输入命令
        /// 
        public ICommand CancelCommand { private set; get; }


        private IGuessPoemService service;
        private GuessLineDisplayDto currentGame;

        private Dictionary buttons;
        private Stack

你可能感兴趣的:(实践Xamarin的MVVM)