众所周知,在UWP中,微软为我们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定。在性能方面,运行时绑定Binding与它相比还是有些逊色的。因此针对一些确定的、不需要变更的数据,我们完全有理由来使用X:bind进行绑定。(当然,如果你不在乎程序性能的话就没必要继续往下看了!)

悉MVVM的朋友都知道,我们常常遇到这样一种情况:我们需要为一个控件绑定一个ViewModel中的Command,但是这个控件并没有Command属性?笼统的解决方法有很多,我这里大致列举几种常用的解决方法:

1、EventToCommand(较常规)

通过事件触发器来进行关联,这种解决方法是最常规的也是最普遍的。通过Blend,我们可以发现微软为我们提供了10种不同的行为来满足我们的开发需求。至于具体如何使用这里就不再详述,感兴趣的朋友可以看一下我之前写的一篇文章:在UWP中实现自己的MVVM设计模式。 那里面有相关介绍,此处仅截图显示这10种行为。

2、消息机制(较灵活):

如果你已经在你的项目中使用了MVVMLight的话,你就会多一种选择,那就是他已经为你封装的一套消息机制(当然,你完全也可以自己去实现)。你可以通过发送消息和注册消息来确保控件在合适的事件中去处理ViewModel中合适的事情。这一部分如何使用可以参考博客园中@楼上那个蜀黍写的几篇关于如何使用MVVMLight文章,里面有相关介绍,挺适合新入门的朋友。这里仅列出对应的类成员:

3、X:Bind(较朴实):

利用原生的X:bind也可以将事件注册到对应的ViewModel中。前面我们已经大致了解了使用它的好处,因此我打算大致演示一下该如何使用它。我这里演示一下如何将TextBlock的Tapped事件注册到MainViewModel中:

首先我们需要将事件注册到ViewModel中,代码很简单,和VS为我们自定生成的代码完全一样,你完全可以将VS为你自动生成的事件函数剪切到对应的View中。但是有一定是需要注意的,我们需要将该函数的访问修饰符设置为Public,否则View是无法访问的。示例代码如所示:

其次,我们需要将TextBlock的Tapped事件与ViewModel中注册的事件关联起来,我们试试常规的绑定:

 <TextBlock Text="Click Me" Tapped="{x:Bind TextBlock_Tapped}" />

或许你写到这已经开始调试运行了,但是结果可能并没有达到你的预期要求,VS会给你报一个这样的错误:无效的绑定路径“TextBlock_Tapped”: 类型“MainPage”上无法找到属性“TextBlock_Tapped”。

遇到错误不要慌,我相信你能够看懂这就错误提示给你的解决方案。对,你需要在对应的MainPage.cs中为其设置对应的数据上下文,这样做的目的是告诉编译器:当你要编译的时候,你在我指定的数据上下文中绑定对应的函数。因此,我们在对应的cs中进行相关的数据上下文赋值:

  public sealed partial class MainPage : Page
{
public MainViewModel VM { get; }
public MainPage()
{
this.InitializeComponent();
VM = this.DataContext as MainViewModel;
}
}

然后在对应的XAML中将绑定进行相应的修改:

 <TextBlock Text="Click Me" Tapped="{x:Bind VM.TextBlock_Tapped}"/>

写到这里,你已经成功将一个View中的控件的事件在ViewModel中注册了,这样你就可以在ViewModel中处理对应事情。关于X:bind更多的介绍可以参考博客园中一位博主 @E不小心 博文。

4、自定义Command属性(有逼格):

通过自定义依赖属性为控件添加Command属性,我不得不说这种实现方式是最有逼格的。说实话,我在写代码的时候,不到万不得已,我是不会使用自定义依赖属性来解决我的问题的。因为有时候我在写它的时候会遇到一些莫名其妙的问题,哎,只怪我学艺不精,对这种技术暂时是望成莫及。千万不要问我怎么写,我也不会,渣渣一个,望诸位大神见谅!

    5、总结:

在实际开发中,我们遇到的问题总会层出不穷,上述几种解决方法并不是一本万利的,它们各有利弊,我觉得授人以鱼不如授人以渔,合适的才是最好的。因此,上述的4种方法在我看来并没有什么可比性,无论是复杂亦或是简单,只要能随机应变,具体情况具体分析就好!

ViewModel处理View相关事件的多种方式(非技术贴,仅学习总结)的更多相关文章

  1. jQuery绑定事件-多种方式实现

    jQuery绑定事件-多种方式实现: <html> <head> <meta charset="utf-8" /> <script src ...

  2. 与众不同 windows phone (24) - Input(输入)之软键盘类型, XNA 方式启动软键盘, UIElement 的 Touch 相关事件, 触摸涂鸦

    原文:与众不同 windows phone (24) - Input(输入)之软键盘类型, XNA 方式启动软键盘, UIElement 的 Touch 相关事件, 触摸涂鸦 [索引页][源码下载] ...

  3. ASP.NET MVC传递Model到视图的多种方式总结(一)__通用方式的使用

    有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别 ...

  4. ASP.NET MVC传递Model到视图的多种方式总结

    ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel T ...

  5. ASP.NET MVC传递Model到视图的多种方式之通用方式的使用

    ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...

  6. Android事件分发机制二:viewGroup与view对事件的处理

    前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...

  7. Android View 的事件体系

    android 系统虽然提供了很多基本的控件,如Button.TextView等,但是很多时候系统提供的view不能满足我们的需求,此时就需要我们根据自己的需求进行自定义控件.这些控件都是继承自Vie ...

  8. MVVM模式下,ViewModel和View,Model有什么区别

    摘自正美的5群 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工 ...

  9. 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系

    本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...

随机推荐

  1. 17.异常(三)之 e.printStackTrace()介绍

    一.关于printStackTrace()方法 public void printStackTrace()方法将此throwable对象的堆栈追踪输出至标准错误输出流,作为System.err的值.输 ...

  2. Python之旅Day1 数据类型初识(数字|字符串|列表|数据运算) 编码 表达式(if...else|for|while)

    初识PYTHON Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(吉多·范罗苏姆)于 ...

  3. mysql 存储过程 CONCAT 字符串拼接

    mysql 存储过程 CREATE PROCEDURE pro_province_report (IN startDate VARCHAR(),IN endDate VARCHAR(),IN Sour ...

  4. 【接口时序】3、UART串口收发的原理与Verilog实现

    一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...

  5. LabVIEW(十六):多列列表框控件

    1.多列列表框控件:前面板右键>列表.表格和树>多列列表框2.默认情况下只显示列首,可设置显示行首:前面板选中多列列表框右键>显示>行首3.LabVIEW中提供42种自带的图标 ...

  6. Tools - UML

    ProcessOn - 在线绘图工具 ProcessOn 支持流程图.思维导图.原型图.UML.网络拓扑图等: 主流的UML图列都支持,可以作为方便快捷的UML工具: PlantUML - 多系统多编 ...

  7. 5月份值得一看的 Java 技术干货!

    5月又即将要离我们远去了,这个月有小长假51劳动节,有54青年节,有513母亲节,更有坑爹的520神马节?!! 废话不说,又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,都是不得不 ...

  8. Mac下命令行tree生成文件树

    不像Windows,Mac环境本身是没有tree命令的,但可以后天呐~ 1.下载文件包并将其放在系统目录下(本人存放路径为/Users/) https://homebrew.bintray.com/b ...

  9. Linux学习笔记之一————什么是Linux及其应用领域

    1.1认识Linux  1)什么是操作系统 2)现实生活中的操作系统 win7 Mac Android iOS 3) 操作系统的发展史 (1)Unix 1965年之前的时候,电脑并不像现在一样普遍,它 ...

  10. LoadRunner通过SiteScope监控MySQL的性能

    步骤: 安装 SiteScope 下载 Java 版的MySQL 驱动, 下载地址:http://www.mysql.com/downloads/connector/j/ 下载成功后,把解压缩的 my ...