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

众所周知,在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种方法在我看来并没有什么可比性,无论是复杂亦或是简单,只要能随机应变,具体情况具体分析就好!

时间: 2024-10-13 01:45:44

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

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

jQuery绑定事件-多种方式实现: <html> <head> <meta charset="utf-8" /> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script><!--百度CDN--> </head> <body> <input type="text"/&

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

ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别显示老师课程表.学生上课表,如图: 相关的Model: 1 public class Course 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5

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

ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别显示老师课程表.学生上课表,如图: ? 相关的Model: 1 public class Course 2 { 3 public int Id { get; set; } 4 public string Name { get

Android进阶——构建UI布局的多种方式总结

引言 作为Android App,给人第一印象的就是用户界面(UI),简洁友好的UI,自然会给用户优秀的体验,自然很容易就得到用户的认可和赞许,这样App才变得真正的有价值.所以作为开发App的第一步,UI尤为重要,构建UI有很多种方式:xml静态布局.java动态代码.HTML构建(借助WebView)和第三方开源框架等. 一.构成UI的基本元素--View和ViewGroup概述 在Android中绝大部分的UI组件都是存放在android.widget包及其子包.android.view包

Android 开源项目android-open-project工具库解析之(二) 高版本向低版本兼容,多媒体相关,事件总线(订阅者模式),传感器,安全,插件化,文件

六.Android 高版本向低版本兼容 ActionBarSherlock 为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题 项目地址:https://github.com/JakeWharton/ActionBarSherlock Demo地址:https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos APP示例:太多了..现在连google都

Android入门——构建UI布局的多种方式

引言 作为Android App,给人第一印象的就是用户界面(UI),简洁友好的UI,自然会给用户优秀的体验,自然很容易就得到用户的认可和赞许,这样App才变得真正的有价值.所以作为开发App的第一步,UI尤为重要,构建UI有很多种方式:xml静态布局.java动态代码.HTML构建(借助WebView)和第三方开源框架等. 一.构成UI的基本元素--View和ViewGroup概述 在Android中绝大部分的UI组件都是存放在android.widget包及其子包.android.view包

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

View的事件体系

一.什么是View?什么是ViewGroup? View是Android中所有控件的基类,不管是Button.ListView还是RelativeLayout,它们的基类都是View.View是一种界面层的控件的一种抽象,代表了一个控件. 而什么是ViewGroup,从字面上看,ViewGroup应该指的是一个控件组,即ViewGroup中可以包含许多控件.而ViewGroup继承自View,所以View本身就可以是单个控件也可以由多个控件组成的一组控件.这样就构成了View树. 二.View的

Android艺术开发探索第三章————View的事件体系(下)

Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动,现在我们再来聊聊一个比较核心的知识点,那就是事件分发了,而且他还是一个难点,我们更加应该掌握,View的滑动冲突一直都是很苦恼的,这里,我们就来一起探索一下 1.点击事件的传递规则 我们分析的点击事件可不是View.OnClickListener,而是我们MotionEvent,即点击事件,关于M