win10 uwp MVVM入门

MVVM 是一个强大的架构,基本从 WPF 开始,wr(我说的就是微软)就提倡使用 MVVM。它可以将界面和后台分离,让开发人员可以不关心界面是怎样,全心投入到后台代码编写中。

然后在编写完后台代码后,可以快速和界面设计师做出来的界面绑定到一起,即使频繁修改界面也几乎不需要去修改后台代码。

更让人喜欢的是,他可以让我们简单地进行单元测试,因为我们可以不打开界面进行测试功能,方便了我们的测试开发。

UWP 虽然可以直接在xaml.cs 写逻辑但是我们是推荐使用 MVVM 框架,写一个自己的框架也很简单。

本文主要:如何在 UWP 使用 MVVM,如何做一个自己的框架。

MVVM 是 View、Model、 ViewModel 合起来的称呼。

  • View 就是界面。软件中,可以这样看,我们看到的都是界面,看不到的就是后台,在 UWP 中我们说的 View 一般是 page UserControl 等。我们写界面时用 xaml 和 cs 结合起来,做出好看的效果。

  • ViewModel 是界面的抽象,这里我们不需要去理会界面长什么样,我只需要知道我们需要给界面提供什么。这就是说我们可以不管界面而将业务逻辑抽象出来。ViewModel 可以简单单元测试,因为我们不需要打开界面。

  • Model 是核心逻辑,有些大神说, Model 只定义数据结构,有些大神说 model 写核心逻辑,这个就仁者见仁智者见智了。我是将核心逻辑写进 Model,如果觉得这样不对,欢迎讨论。

但是我们现在的问题是怎么让 ViewModel 抽象 View,随后简单地把界面联系起来呢?

使用 Binding 即可,这是 WPF 强大的地方,而 UWP 继承并发扬了这些特性。

如果希望知道 MVVM 是如何写 ,戳此链接 http://www.cnblogs.com/indream/p/3602348.html

关于Model是属于哪些代码所放的地方,我找到一篇博客,在CodeProject,也是最近10月写的,依照他的逻辑,是支持Model写业务逻辑,ViewModel写表示逻辑的看法。请看下面图片,博客在:https://www.codeproject.com/Tips/813345/Basic-MVVM-and-ICommand-Usage-Example

我们下面说下绑定。

绑定

我们有多种方式绑定 ViewModel 。关于 ViewModel 实现的位置有下面几种。

  • 写在xaml.cs,这是最简单的方式,可以使用代码或在xaml绑定DataContent和ViewModel

  • 写成 xaml 静态资源,这个方式我们使用次数还是比较多,可以让 Code 不写代码就可以绑定 DataContent 和ViewModel

  • 写在一个 ViewModel 静态类,我们把其他页面的 ViewModel 统一写到一个 MainViewModel ,而且他是静态或只有一个实例,这样可以在任何地方调用到。

  • 写在 App.xaml 静态资源。这个方式和写在 xaml 差不多,只是可以在 xaml 设置 Page 的 DataContent 。

  • 写在App.xaml一个静态 ViewModelLocate 包括用到的 ViewModel 。这个方式是 MVVMLight 做的,我模仿他的想法,推荐使用这个方法。

下面我简单介绍这几种方式。

最简单的方法,是在xaml.cs 写一个 ViewModel ,假如我们的 ViewModel 叫 Linmodel ,我们可以在 xaml.cs 写类似下面的

        public MainPage()
        {
            ViewModel = new LinModel();
            this.InitializeComponent();
            DataContext = ViewModel;
        }

        private LinModel ViewModel
        {
            set;
            get;
        }

我们也可以把 ViewModel 换成其他名字,遇到需要具体什么名称就使用最好的。

注意我们的ViewModel 实现的地方一般是在InitializeComponent之前,也就是放在类的构造的最前或直接如下面一样

        private LinModel ViewModel
        {
            set;
            get;
        }=new LinModel();

这个方式是6之后才有的,初始化值可以写在自动属性定义。 因为我们需要的 ViewModel 几乎不会修改,所以我们还可如下面,去掉set 。很少会在实现 ViewModel 后在别的地方修改。但是我们在后面会看到,我们使用了页面导航传参,传的是 ViewModel ,这时我们就不能设置 set 去掉。但我们可以设置 private set;

        private LinModel ViewModel
        {
            get;
        }

因为我们不需要使用 public ,我们就可以这样简单写 ViewModel ,除了需要记得我们的ViewModel 的实现需要在InitializeComponent之前,还需要记得 DataContent 需要在InitializeComponent之后。

DataContent 的另一个写法是写在 xaml ,很简单,这个方法我们要修改ViewModel 的访问privatepublic,下面代码写在页面Page

DataContext="{Binding RelativeSource={RelativeSource Self},Path=ViewModel}"

RelativeSource 可以绑定到xaml.cs,我们就简单可以从 cs 获得 ViewModel

这是一个简单的方法。

我建议大家把 DataContext 写在 xaml ,至于为何这样是我推荐的,卖个关子,大家自己试试,把 DataContext 写在xaml.cs和 xaml 中看下 xaml 的提示补全,就知道为何推荐这个方法。

说完了简单方法,我们来说下
ViewModel 写在 xaml ,xaml.cs不写代码这个方式。 ViewModel 需要有 static 的属性,这个属性的类就是ViewModel本身,也就是 ViewModel 可以实现的只有一个。当然 static 不是必需的,我们依靠静态资源就可以绑定到 ViewModel 的属性,从而绑定 ViewModel 。

    <Page.Resources>
        <view:LinModel x:Key="LinModel"></view:ViewModel>
    </Page.Resources>
        <Grid DataContext="{Binding Source={StaticResource LinModel},Path=ViewModel}">

        </Grid>
    public class LinModel
    {
        public LinModel()
        {
            ViewModel = this;
        }

        public static LinModel ViewModel
        {
            set;
            get;
        }//让绑定可以访问 ViewModel ,其实这里我们也可以不使用static
    }

注意我们不能把 DC 写在 Page ,如果写在 Page ,运行Cannot find a Resource with the Name/Key

我们用到 staticResource ,我们为了可以在页面使用 DataContent ,我们可以把静态写在App.xaml

<Application
    x:Class="JiHuangUWP.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:JiHuangUWP"
    xmlns:view="using:JiHuangUWP.ViewModel"
    RequestedTheme="Light">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:LinModel x:Key="LinModel"></local:LinModel>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>


<Page
    x:Class="Framework.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Framework"
    xmlns:view="using:Framework.ViewModel"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    DataContext="{Binding Source= {StaticResource LinModel},Path=ViewModel}"
    mc:Ignorable="d">

我们这个写法可以让 cs 不写代码,如果我们有多个相同页面,那么我们不可以使用这个办法。

我们要把static去掉也是可以,这是这样我们在 Code 就不能使用LinModel.ViewModel 获得 ViewModel 。我们上面办法是可以不再 Code 写代码,所以去掉static,其实影响几乎没有

    public class LinModel
    {
        public LinModel()
        {
            ViewModel = this;
        }

        public /*static*/ LinModel ViewModel
        {
            set;
            get;
        }
    }

那么去掉了 static ,是不是我们就没有办法在 xaml.cs 获得 ViewModel ?在软件开发中,怎么可以说不可能呢,我们有一个简单的方法。我们不是从 DataContext 绑定 ViewModel ,那么 DataContext 就是 ViewModel ,我们拿出 DataContext 转换,于是得到 ViewModel 。注意 DC 写的地方,千万不要在一开始写,如果发现你的 DC 是 Null ,那么你写的肯定不对

            InitializeComponent();
            ViewModel = (LinModel) DataContext;

这是一个简单方法,其实有一些比较难做,我将和大家说去做一个自己的框架。

我们说完了在App.xaml 使用静态资源,还没说如何写一个类,包含我们的 ViewModel ,然后写出静态资源,我们所有的 ViewModel 都从他这里拿。

我们下面开始说这个方法,这个方法是 MVVMLight 使用的,想要看 MVVMLight 入门的,请去看叔叔写的入门:http://www.cnblogs.com/manupstairs/p/4890300.html

我们定义个类,这个类叫 ViewModelLocater ,假如我们有两个 ViewModel ,一个是 AModel ,一个是 LinModel ,那么我们在 ViewModelLocater 写两个属性。

        public AModel AModel
        {
            set;
            get;
        }

        public LinModel LinModel
        {
            set;
            get;
        }

然后在 App.xaml 写静态 ViewModelLocater

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <view:ViewModelLocater x:Key="ViewModelLocater"></view:ViewModelLocater>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

这样我们就可以在 APage 和 LinPage 的 Page 写 DataContent 绑定ViewModel

<Page
    x:Class="Framework.View.APage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Fr
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值