MainViewMode.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace WPFTest1
{
// INotifyPropertyChanged 让Name和Title变化之后,前台能够显示变化
public class MainViewMode : INotifyPropertyChanged
{
public MainViewMode()
{
// 构造函数初始化会动态改变的值
Name = "Hello";
Title = "标题";
// 使用
ShowCommand = new MyCommand(show);
}
// 定义之后后台才能Binding
public MyCommand ShowCommand { get; set; }
// 属性Name
private string name;
public string Name
{ get { return name; }
set { name = value;
// 属性产生变化后使前台显示同步改变
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
// 属性Title
private string title;
public string Title
{
get { return title; }
set
{
title = value;
// 属性产生变化后使前台显示同步改变
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Title"));
}
}
// 进行值得改变
public void show()
{
Name = "点击了按钮";
Title = new Random().Next(1, 10).ToString();
MessageBox.Show(Name);
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
MainWindow.xaml
<Grid>
<StackPanel>
<TextBox Text="{Binding Name}"/>
<TextBox Text="{Binding Title}"/>
<Button Content="Show" Command="{Binding ShowCommand}"/>
</StackPanel>
</Grid>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WPFTest1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 定义上下文数据,使MainViewMode成为其数据来源
this.DataContext = new MainViewMode();
}
}
}
MyCommand.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace WPFTest1
{
// 自定义一个Command,必须继承ICommand
public class MyCommand : ICommand
{
// 一个委托
Action executeAction;
// MainViewMode.cs中 MainViewMode构造方法传入的委托 由 MyCommand 构造方法进行接收
public MyCommand(Action action)
{
// 接收委托
executeAction = action;
}
// 实现接口 ICommand 时自带的
public event EventHandler CanExecuteChanged;
// 实现接口 ICommand 时自带的,return true;是自己写的,true表示可执行
// 程序执行后,点击按钮, 工具此处返回的值判断是否能够执行
public bool CanExecute(object parameter)
{
return true;
}
// 程序执行后, 如果能够执行则开始执行,执行的是 MyCommand构造函数那边 传入的一个委托
public void Execute(object parameter)
{
// 执行委托:show (从 MainViewMode.cs传入)
executeAction();
}
}
}
点击按钮之前:
点击按钮之后 :Show上面的文本框发生了变化并出现弹窗
流程梳理:
1. 创建页面,后端 ViewMode 设置属性,前端 xaml 绑定属性
2. 自定义 MyCommand 指令,使按钮绑定该指令,按下时触发该指令
3. 按下按钮,执行绑定的指令,指令调用方法改变值,以委托的形式传递,最后执行传递过来方法,看似是执行指令Command, 实际是执行以委托形式传递到 MyCommand 的中的方法
4. 指令执行后,属性同步改变,使前端显示同步改变