silverlight 学习笔记 (六): MVVM Light Toolkits 之 Messager

在MVVM模式中,我们可以看到View和ViewModel相对独立出来,这就引发了View与ViewModel及ViewModel见的通信,以本人看来,目前View和ViewModel见通过数据的绑定实现简单通信,一个View能够找到它所需要的ViewModel,绑定可以实现单向和双向的数据通信,而ViewModel间的通信又如何来实现呢?

简单来说如果有个View叫va,对应的存在一个viewmodel叫vma,还有一个view叫vb,对应的viewmodel叫vmb,如果我们在va中一个属性的变化,我们想让vb中也能有所变化,就好比va将变化通知vb,希望vb对变化进行处理。这时我们以前的做法可能是由va向vb传递一个参数,并触发或调用vb中一个公开的方法。那么在MVVM中由于View间相对对立更多的业务逻辑有Viewmodel来完成,这就意味着View间通信实际有VM来完成,但是一个vm有可能有多个view应用,又如何让Va的变化只反映到VB中呢?所以我认为这就是我要选择MVVM light tookkit 中的Messager了。

Messager能为我们做什么?

在刚开始学Messager时总以为他是一个消息框而已,类似Messagebox,但学习以后才发现错了。简单说Messager是为我们提供了消息的发生和接收,消息发送可以指定消息对象也可采用广播即只要注册同意接收我的消息的实例都会收到广播信息。另外在信息接收方可以注册需要接收的信息并指定收到信息后需要处理的方法。说到这里大致了解了Messager的核心意图了。

如何实现?

在E站看了一个实例,简单说下实现过程

示例:首先在ViewModelLocator中添加两个静态ViewModel属性,保障每个ViewModel只有一个实例。

1、在mainpage中添加一个属性,将该属性变化将会广播到发生信息

 public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            Messenger.Default.Register<PropertyChangedMessage<string>>(this, (s) => MessageBox.Show(s.NewValue));//自身也可以接收消息
        }

        private string pA = "PA";
        public string PropertyA
        {
            get { return pA; }
            set
            {
                string oldValue = pA;
                pA = value;
                RaisePropertyChanged("PropertyA", oldValue, value, true);//这里开始广播消息,这是一个属性变化引起的广播,更复杂的可以用Send方法

            }
        }
    }

2、在第二个ViewModel中接收消息

public class TestViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the TestViewModel class.
        /// </summary>
        public TestViewModel()
        {
            Messenger.Default.Register<PropertyChangedMessage<string>>(ViewModel.ViewModelLocator.MainStatic, (s) =>TestString=s.NewValue);//这里注册接收消息,指定消息处理方法,主要要在构造函数中完成

        }

        private string ts = "TS";
        public string TestString
        {
            get { return ts; }
            set
            {
                ts = value;
                RaisePropertyChanged("TestString");
            }
        }
    }


问题思考
1、Messager确实实现了我们View及ViewModel的通信,但发现通信中的ViewModel一定是实现实例化的,这样才能及时接收到信息并处理,所以才会在ViewModelLocator中定义若干个ViewModel的静态实例对象,如果是小应用倒也没什么,但如果一个大一些的项目如何管理这些对象一定是个问题,难道要用传说中的Prism实现依赖注入?

2、上面也提到View间的通信其实是由ViewModel来完成,这就带来了ViewModel的设计的复杂程度,不但要做好自身对有可能的多个View的抽象处理,还要负责对相关联的ViewModel的通信处理。

哎,越学越觉得自己无知!高手们欢迎来我这里指点指点啊!!!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值