WPF Command指令和INotifyPropertyChanged

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. 指令执行后,属性同步改变,使前端显示同步改变

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值