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

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

     众所周知,在UWP中,微软为咱们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定。在性能方面,运行时绑定Binding与它相比仍是有些逊色的。所以针对一些肯定的、不须要变动的数据,咱们彻底有理由来使用X:bind进行绑定。(固然,若是你不在意程序性能的话就不必继续往下看了!)html

     悉MVVM的朋友都知道,咱们经常遇到这样一种状况:咱们须要为一个控件绑定一个ViewModel中的Command,可是这个控件并无Command属性?笼统的解决方法有不少,我这里大体列举几种经常使用的解决方法:设计模式

     一、EventToCommand(较常规app

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

     二、消息机制(较灵活):性能

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

     三、X:Bind(较朴实):this

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

     首先咱们须要将事件注册到ViewModel中,代码很简单,和VS为咱们自定生成的代码彻底同样,你彻底能够将VS为你自动生成的事件函数剪切到对应的View中。可是有必定是须要注意的,咱们须要将该函数的访问修饰符设置为Public,不然View是没法访问的。示例代码如所示:设计

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

 <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不当心 博文。

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

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

    五、总结:

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

相关文章
相关标签/搜索