• Caliburn Micro 框架 WP8使用研究(二)页面导航


    背景

    对于MVVM 架构的WP程序,一个很关键的问题就是导航,以及导航传参。有过经验的人很清楚WP导航只能在View中进行,并且导航参数也只能在NavigatedTo等View的事件中获取,如此我们便不得不在xaml.cs文件中加上处理,以获取导航参数然后再通过导航参数构造ViewModel。这个过程很痛苦,因为我们不得不再两个文件中来回切换来看我们的逻辑代码。

       

    那么接下来我们看下CM作者的厉害之处(必须承认,真的很厉害),

       

    让我们看下CM框架中导航是什么样子的:

       

    不带参数的情况下:

       

    在ViewModel中定义以下函数:

       

    这两行涵盖的很多的信息,我们首先看下初次看到这几行时会存在的疑问:

       

    1、navigatoinService是什么?

    这个成员是如此定义的:

       

    通过代码我们不难看出,这里通过依赖注入,MainPageViewModel会得到INavigationService接口类型的对象事例(CM采用容器进行对象的获取,上文提到我们在Bootstrapper里面定义了一个Container,此处不做展开,读者清楚通过此方式得到实例即可)。

       

    2、UriFor是做什么的?

    CM的页面导航是基于ViewModel的导航,自处我们调用UriFor<ActionPractisePageViewModel>,那么调用了UriFor之后,CM内部会自动定位到工程中定义的ActionPractisePage.xaml中(注意:此处定位基于命名协定,命名规则需匹配APage.xaml->APageViewModel)并自动构建出导航的Uri。

       

    3、Navigate?

    这个函数是导航执行的操作,找到ActionPractisePage.xaml后,便可导航到此页面,并且CM会根据命名协定通过Container再次得到ActionPractisePageViewModel,并将ViewModel自动Binding到View上。

       

    4、其他呢?

    事实上很神奇的一件事情就是,我们甚至可以删除ActionPractisePage.xaml.cs,因为CM内的导航执行后会自动调用ActionPractisePage的InitializeComponent()完成页面的构造工作。如此我们的工程目录看起来使这个样子:-)

       

       

    5、难道只需要这一行代码么?

    前面提到导航后会通过Container得到viewModel的一个事例,因此我们需要在Bootstrapper内配置ActionPractisePageViewModel:

       

    看起来很不错,通过CM提供的导航我们可以在ViewModel中基于ViewModel进行定位并且导航。调用十分简洁,流畅接口让调用也十分容易,不易出错。

       

    导航带参数的情况

       

    前面提到导航带参数处理很麻烦,那么CM是如何处理的呢?依然是一段代码开始:

       

       

    相比前面多了一个函数WithParam,我们依然带着疑问往下分析:

    1、两个参数什么意思?

    这个问题深入进去的话涉及到一些C#的高级语法,我们看下这个函数的定义:

       

       

    这里用到lambda表达式去成员的操作,读者若不熟悉可以忽略此处实现,知道这个函数第一个参数指定的是ViewModel内的属性,第二个参数指定这个属性的值即可

       

    2、这样带着参数导航,CM会做什么事情?

    a、前面提到CM导航时后构造Uri,那么如果我们调用WithParam之后,便会在Uri中添加参数信息。(即将参数封装到导航串中)

    b、在完成导航之后,从容器中取得对应的viewModel并且,自动将导航串中的参数取出,赋值到ViewModel中对应的属性上。

    ViewModel定义如下:

       

    那么当到达StrageTestPage的时候,Name属性就已经是之前传递的"Good!"了。

       

    以上就是CM框架中对导航的支持,非常灵活而且强大,省去很多事情,让我们从导航参数的各种存取中解放出来。

       

    CM框架的灵活和强大远不止如此,后续文章中会继续介绍关于独立存储的支持。

       

    QQ交流群:182659848

  • 相关阅读:
    2021-01-27:如何把文件从服务器复制到本地,用什么命令?
    2020-01-26:mysql8.0做了什么改进?
    2020-01-25:redis中,哨兵如何选举?
    2020-01-24:手写代码:快速排序。
    2021-01-23:LFU手撸,说下时间复杂度和空间复杂度。
    2021-01-22:java中,HashMap的写流程是什么?
    2021-01-21:java中,HashMap的读流程是什么?
    2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?
    2021-01-19:mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量差不多占50%,根据条件把个体户的行都删掉。请问如何操作?
    USB Type-C设备是否需要CC逻辑芯片 ------ 转载
  • 原文地址:https://www.cnblogs.com/tianhonghui/p/3121092.html
Copyright © 2020-2023  润新知