微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的通信处理。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐