[MVVM]02-MVVMLight页面前后台消息和命令传递

来源:互联网 发布:淘宝分店怎么开 编辑:程序博客网 时间:2024/06/05 03:18

MVVMLight页面前后台消息和命令传递

场景

  • 一个文本框一个按钮点击按钮把文本框的内容弹出来

操作

  1. 建立View和ViewMode之间的关系
    • 就是指定窗口xaml的Datacontext也就是窗口上下文为ViewMode类
      可以直接通过绑定来实现
 <Application.Resources>    <ResourceDictionary>      <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:MyMvvmLight.ViewModel" />    </ResourceDictionary>  </Application.Resources>  //这个构造器通过nuget是自动安装的但是在uwp不会自动安装,通过lib安装也不会生成   DataContext="{Binding Main, Source={StaticResource Locator}}"  
  • 可以通过构造函数
  public MainView()           {               this.DataContext = new MainViewModel();// find correct wife           }   
  • 也可以通过xaml文件来实现两者之间的关联
 <Window.DataContent>        <vm:ViewModel /></Window.DataContent>
  1. UI的部分就在xaml文件和xaml文件的cs文件中
 <TextBox Width="100" Text="{Binding Txt,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Margin="246,41,171,65" Background="LightBlue" />        <Button Width="100" Height="30" Command="{Binding ShowTxtCommand}" Content="ShowTxtCommand" Margin="0,100,0,0"></Button>
  1. viewMode可以专心写逻辑,这个需求不用model层,后面的例子会讲到
 //初始化命令            ShowTxtCommand = new RelayCommand(ShowMsg, CanShowMsgExecute);             private string _txt;        /// <summary>        /// 绑定到界面的Txt        /// </summary>        public string Txt        {            get            {                return _txt;            }            set            {                _txt = value;                RaisePropertyChanged(() => Txt);            }        } /// <summary>        /// 命令具体实现        /// </summary>        private void ShowMsg()        {            MessageBox.Show(Txt);        }        /// <summary>        /// 显示消息命令是否可以执行        /// </summary>        /// <returns></returns>        private bool CanShowMsgExecute()        {            return !string.IsNullOrEmpty(Txt);        }

提示

  • RelayCommand是对wpf命令的包装,实现了命令的一些基本操作
  • 本文的第一个参数就是消息令牌,第二个参数就是按钮(命令的发出者能不能发命令)这里我们可以看到如果文本框没有内容那按钮是不可以用的,所有的操作都在绑定和命令实现过了。有多重载参考官文
  • mvvmlight命令模式如果发现有问题,是这框架有点问题,已修复过了引用
    using GalaSoft.MvvmLight.CommandWpf;而不是用//using GalaSoft.MvvmLight.Command;
    wup一定要用//using GalaSoft.MvvmLight.Command;
  • 一定不要用Click事件,来实现上面相关的功能,你想想你要初始化的时候检查文本框的内容,还要建立两个控件的直接引用关系,而且还要在文本框更改事件下修改按钮的状态。还要进行一系列的检测。
  • 当然不用命令也可以实现功能,但是命令模式是不优势的,用了wpf的先进的技术却不接受这新新的开发思想,用老的东西思路开发,会让功能和效率有点折扣。也影响开发效率。这里写图片描述
    源码

技术开发一定要配套,为何有很多语言有很多不好的设计却不修复,就因为有很多人用那样不正规的开发手段来开发东西,走在规则的边缘来进行开发。语言一定要用正确的方式打开。潘多拉的盒子大家懂的。

原创粉丝点击