zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/tianhonghui/p/3121092.html
Copyright © 2011-2022 走看看