MVVM、MVVMLight、MVVMLight Toolkit 之我的理解

MVVM Light

最近才解除到WPF,也知道MVVM Light是一个不错的设计模式

学习了几天,写一下我自己对这个理解

大家都知道,普通的三层模式,是将业务逻辑层,数据层跟UI分开,但是UI的后台内代码还是很多

MVVM Light 的理想状态,是将后台的代码抽空,当然这是极限状态。

这里写了一个小例子,我觉得还是可以展示下MVVM Light的核心思想和表现

主要实现是 主窗口和 子窗口之间的通信。

 

这个是MVVM Light的项目结构 (其中子页面的那个名字取的不好,失望)

  1. 大致的思路是这样的,一般情况下 View中的一个页面,在ViewModel里面对应个ViewModel类。

 

下面我们开始一步一步的,编写这个Demo,希望大家有一点了解。

主页面画这样的页面

  1. 接收的文本框修改为Text="{Binding Value,Mode=TwoWay}" ,发送为Text="{Binding Value,Mode=TwoWay}"
  2. 发送的按钮修改  Command="{Binding Tochild}"  

 

#这里解释下{Binding Value,Mode=TwoWay} ,MainWindow主界面加载的时候,会有一个mianviewmodel的实体类,这地方的Value是类的一个属性,而Mode=TwoWay,意思是双向加载,

也就是 当修改实体类中的Value时,页面中文本框的值会修改发生变化,同样,在页面中修改文本框,实体类中的Value属性值也会修改

#解释下 Command="{Binding Tochild}"  这里的Tochild是一个RelayCommand,先不说

 

下面我来说 mainviewmodel中的

 

定义两个属性

 public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary> 
        public MainViewModel()
        {
            Messenger.Default.Register<string>(this, "mainwindow", msg => show(msg));
            Tochild = new RelayCommand(sendtochild);
        }

        public RelayCommand Tochild { get; set; }

        public void sendtochild()
        {
            Messenger.Default.Send<string>(Send, "childwindow");
        }

        public void show(string str)
        {
            Value = str;
        }

        private string send;

        /// <summary>
        /// 发送
        /// </summary>
        public string Send
        {
            get { return send; }
            set
            {
                send = value;
                RaisePropertyChanged("Send");
            }
        }


        private string value;

        /// <summary>
        /// 接收
        /// </summary>
        public string Value
        {
            get { return this.value; }
            set
            {
                this.value = value;
                RaisePropertyChanged("Value");
            }
        }


    }
MainViewModel

#这里解释下, RaisePropertyChanged("Send"); 每个属性的set后有一句 RaisePropertyChanged,作用就是在,实体类中 当属性值修改后,会通知页面修改值(不知道这样描述是否错了)
# show()方法,修改Value属性值,而当Value值修改时,前台又会变动, 这里Send是要发送到子窗口的值,Value是从子窗体接受的值

这里再贴下viewViewModel的代码

 public class viewViewmodel : ViewModelBase
    {
        public viewViewmodel()
        {
            Messenger.Default.Register<string>(this, "childwindow", msg => showvalue(msg));
            ToMainwindow = new RelayCommand(sendtomain);
        }

        public RelayCommand ToMainwindow { get; set; }

        public void sendtomain()
        {
            Messenger.Default.Send<string>(Send, "mainwindow");
        }
        public void showvalue(string str)
        {
            Value = str; 
        }

        string value;

        public string Value
        {
            get { return this.value; }
            set
            {
                this.value = value;
                RaisePropertyChanged("Value");
            }
        }
        string send;

        public string Send
        {
            get { return send; }
            set
            {
                send = value;
                RaisePropertyChanged("Send");
            }
        }

    }
viewViewmodel

WPF程序 App.xaml中定义全局应用程序资源
 <Application.Resources>
        <local:ViewModelLocator xmlns:local="clr-namespace:mvvmdemo.Locators" x:Key="Locator" /> 
 </Application.Resources>

红色部分 根据自己的程序 修改,要不然到时候别怪我说我Demo有问题。

 

 class ViewModelLocator
    { // Create MainViewModel on demand
        public MainViewModel MainViewModel
        {
            get
            {
                return new MainViewModel();
            }
        }
        public viewViewmodel ViewViewModel
        {
            get
            {
                return new viewViewmodel();
            }
        }
    }
ViewModelLocator

MainWindow 页面中的 修改成这样 <Grid DataContext="{Binding Source={StaticResource Locator},Path=MainViewModel}"  >

view页面中  <Grid DataContext="{Binding Source={StaticResource Locator},Path=ViewViewModel}" >

我想你应该也知道 这句话是什么意思了吧。

在这里已经实现功能了,下一次解释 两窗体之间发送值的 Messenger

也希望高手给我一些批评建议

 

 

 

posted @ 2013-08-27 14:19  无风起浪、  阅读(495)  评论(0编辑  收藏  举报