欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Wpf MVVM——命令绑定和消息发送

程序员文章站 2022-06-07 15:13:55
...

开发工具与关键技术:Visual Studio 2015MVVM

作者:何德润

撰写时间:2020.8.9

MVVM是由Model、ViewModel和View组成。

View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户。
ViewModel是一个C#类,负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View,同时也可以处理一些UI逻辑。
Model,就是系统中的对象,包含一些属性和行为。

命令绑定

在按钮中绑定一个命令:

Xaml界面代码:
<Button Command="{Binding AddECUCommand}">确定</Button>
ViewModel 代码:
    private RelayCommand addCommand;
    public RelayCommand AddCommand
        {
            get
            {
                if (addCommand == null)
                    addCommand = new RelayCommand(() => ExcuteAddCommand());
                return addCommand;
            }
            set { addCommand = value; }
        }
//方法
        private void ExcuteAddCommand()
              {    
 
                    }

用命令绑定ComboBox的值改变事件

Xaml界面代码:

 <ComboBox Name="listComboBox">
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="SelectionChanged">
            <mvvm:EventToCommand Command="{Binding SelectingCommand }" CommandParameter="{Binding ElementName=listComboBox, Path=SelectedItem}"/>
    </i:EventTrigger>
       </i:Interaction.Triggers>
 </ComboBox>
CommandParameter传递参数

注:要在页面引用
  xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
 xmlns:mvvm=http://www.galasoft.ch/mvvmlight

ViewModel 代码:   
 private RelayCommand<AffirmResponseMessageModel> selectingCommand;
 public RelayCommand<AffirmResponseMessageModel> SelectingCommand
        {
            set { selectingCommand = value; }
            get
            {
                if (selectingCommand == null)
                    selectingCommand = new RelayCommand<AffirmResponseMessageModel>((p) => ExecuteSelectingCommand(p));
                return selectingCommand;
            }
        }
//执行方法
        private void ExecuteSelectingCommand (AffirmResponseMessageModel affirmResponseMessageData)
        {
           
        }

MVVM框架的消息通知机制用于View和ViewModel 或 ViewModel和ViewModel 之间的消息通知和接收。

例如:在A页面的ViewModel发送信息到B页面的code-behind页面关闭B页面

A页面的ViewModel代码
        private void ExecuteCommand()
        {
             Messenger.Default.Send<String>("1", "123");//"1"为参数,"123"为消息标识。
        }
B页面的code-behind里面接收消息
  public partial class B : Window
    {
        public B ()
        {
            InitializeComponent();
            //接收关闭窗体信息
            Messenger.Default.Register<string>(this, "123", CloseDialog);
        }
        /// <summary>
        /// 关闭窗体
        /// </summary>
        private void CloseDialog(string msg)
        {
            this.Close();
        }
    }

在A页面的ViewModel发送信息到B页面的ViewModel

A页面的ViewModel
  private void ExecuteCommand()
        {
             Messenger.Default.Send<String>("1", "123");//"1"为参数,"123"为消息标识。
        }
B页面的ViewModel
    public class BViewModel:ViewModelBase
    {
        public BViewModel()
        {
            //接收信息
            Messenger.Default.Register<BaseModel>(this, "123", UpdateDataModel);
        }
 //方法
 Private void UpdateDataModel(string msg){

   }
 }