• MVVM Light (Part 3)


    原文地址:http://jesseliberty.com/2011/01/06/windows-phone-from-scratch%E2%80%93mvvm-light-toolkit-soup-to-nuts-3/

    这是MVVM Light系列的第三部分。今天我们来看看messaging是如何把View Model和View联系起来的。

    我们将构建:

    为了说明这一点,我们回到第一部分建立的例子,并扩展第二部分。我们把Button的Click事件在Page2页面中进行处理。

    我们取消这个命令的处理,用ViewModel来完成MainPage到Page2的导航。不幸的是,我们需要的NaveigationService在ViewModel中是不被支持的。

    从ViewModelView到View应该是不可见的,所以我们需要一个机制,像漂流瓶一样发送一个Message,任何人有兴趣就可以拾起来。具体来说,我们想让ViewModel能够发送一条Message表明是时候导航到Page2了。此外,我们要MainPage进行注册以接收该Message,并在接收端调用NavigationService导航到Page2.

    Messaging

    幸运的是,MVVM Light提供了对Message的广泛支持。为了实现我们的目标,将需要一个相当简单的过程,分为三个步骤:

    1.创建一个类,包含要传递的Message。

    2.在ViewModel中,实例化这个Message类并广播这个Message。

    3.在MainPage.xaml.cs中注册此Message并在接收到的时候处理它。

    在项目中创建一个新Class,命名为GoToPageMessage.

       1: using System;
       2:  
       3: namespace MvvmLightNavigationBehaviorAndMessages
       4: {
       5:    public class GoToPageMessage
       6:    {
       7:       public string PageName { get; set; }
       8:    }
       9: }

    返回MainViewModel.cs并移除GoToPage2方法。创建一个GoToPageMessage的实例(初始化你要导航的页面名称),并使用Messager对象来广播此Message,如下所示:

       1: private object GoToPage2()
       2: {
       3:    var msg = new GoToPageMessage() { PageName = "Page2" };
       4:    Messenger.Default.Send<GoToPageMessage>( msg );
       5:    return null;
       6: }

    需要引用以下命名空间:

       1: using GalaSoft.MvvmLight.Messaging;

    这样就广播了Message,剩下的就是注册一个收件人和响应这个Message。要做到这一点,返回MainPage.xaml.cs,在构造函数或MainPage_Loaded函数中注册Message:

       1: Messenger.Default.Register<GoToPageMessage>
       2: (
       3:      this,
       4:      ( action ) => ReceiveMessage( action )
       5: );

    你需要添加Messaging的声明。

    ReceiveMessage是你要写的一个方法,用来实现导航。

       1: private object ReceiveMessage( GoToPageMessage action )
       2: {
       3:    StringBuilder sb = new StringBuilder( "/Views/" );
       4:    sb.Append( action.PageName );
       5:    sb.Append( ".xaml" );
       6:    NavigationService.Navigate(
       7:       new System.Uri( sb.ToString(),
       8:             System.UriKind.Relative ) );
       9:    return null;
      10: }

    Build程序并运行,点击MainPage的按钮将导航到Page2.

    So,这更容易了吗?

    没有人认为我在这里展示的比直接在code-behind文件里直接处理Click事件更容易。我要说的是这更容易测试,程序猿在ViewModel创建逻辑而不是在code-behind里处理。

    在一般情况下使用behavior和message要远远比这个例子复杂,将在未来的内容继续讨论。

    个人理解:这里只是拿导航做一个例子来说明如何把View和ViewModel联系起来,其实在View中直接写导航事件也是很正常的。

  • 相关阅读:
    使用karma和jasmine进行angularjs单元测试
    NHibernate之(23):探索NHibernate二级缓存(上)
    NHibernate之(22):探索NHibernate一级缓存
    NHibernate之(21):探索对象状态
    NHibernate之(20):再探SchemaExport工具使用
    NHibernate之(19):初探SchemaExport工具使用
    NHibernate之(18):初探代码生成工具使用
    NHibernate之(17):探索NHibernate中使用存储过程(下)
    NHibernate之(16):探索NHibernate中使用存储过程(中)
    NHibernate之(15):探索NHibernate中使用存储过程(上)
  • 原文地址:https://www.cnblogs.com/yanxiaodi/p/2321552.html
Copyright © 2020-2023  润新知