首页 > 其他分享 >(六)WPF数据驱动模式

(六)WPF数据驱动模式

时间:2024-10-02 13:02:29浏览次数:7  
标签:ICommand 委托 CommandBase 绑定 模式 DoAction 驱动 WPF public

 WPF开发方式; MVVM(Model View ViewModel)
1.绑定XAML数据方式
    在 XAML中添加绑定数据和绑定的操作属性
        Content="{Binding MyVar}"

  在XAML对应了的窗体类的构造函数添加数据绑定
        this.DataContext = mainViewModel; //让此页面的数据取MainViewModel对象里去寻找

 

2.实现INotifyPropertyChanged接口更新XAML数据
    因为只在构造函数添加了数据绑定,如果在后续数据变动时则无法更新数据,所以要在MainViewMoel业务逻辑(已经包含数据模型了)中实现INotifyPropertyChanged接口,然后通过委托类型的事件更新绑定字段的数据:

 3.建立CommandBase实现ICommand接口执行按钮动作方法
     建立一个类CommandBase实现ICommand接口:按钮 Command="{Binding ValueCommand}" 行为绑定ValueCommand字段

    class CommandBase : ICommand
    {
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            //绑定的这个命令的按钮是否可用
            return DoCanExecute?.Invoke(parameter) == true;//这里面没有任何执行逻辑,逻辑都被委托Func丢出去了,实例化时传进来含返回值的方法即可
        }

        public void Execute(object parameter)//parameter是订阅此此接口方法的按钮传递过来的参数
        {
        
            DoAction?.Invoke(parameter);//在应用程序主线程上执行指定委托?是Require的缩写?
            
        }

        public Action<object> DoAction { get; set; }//定义一个Action<object> 委托类型,委托需要Invoke()执行
        //那么这个委托在创建CommandBase对象时就可以传递进来一个自定义方法执行了
        //此类是非静态的,所以所有Control都可以使用
        public Func<object, bool> DoCanExecute { get;set; }//定义有返回值的委托类型Func
    }

 

  在实现三个方法同时,自定义一个无返回值的Action委托类型(有返回值的则是Func<>)DoAction,Action<T1,T2,...>参数和传递进来的方法参数对应,属性为空,类为非静态,所以在创建CommandBase对象时就可以通过委托传递进来一个方法。
在业务逻辑类MainViewModel定义ICommand类型字段,在字段封装属性同时创建CommandBase对象,并创建类内DoAction委托将方法传进去给Execute()方法执行,Execute会在绑定ValueCommand字段按钮动作时执行。

  public class MainViewModel:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string myVar="AA";
        private Brush _valueColor=Brushes.Orange;

        public Brush ValueColor
        {
            get { return _valueColor; }
            set { _valueColor = value; }
        }

        public string MyVar
        {
            get { return myVar; }
            set { myVar = value;
                PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("MyVar"));//更新绑定此属性的控件

            }
        }


        //行为绑定处理

        private ICommand _valueCommand;//定义接口类型的字段,
        //通过按钮Command属性绑定行为,按钮点击则会触发实现接口类CommandBase中的Execute()方法
        //通过属性CommandParameter="123"传递参数

        public ICommand ValueCommand
        {
            get {
                if (_valueCommand == null)
                {
                    _valueCommand = new CommandBase() { DoAction = new Action<object>(ValueCommandAction),
                                                       DoCanExecute=new Func<object, bool>(CanExcute) };//实例化同时传递方法给委托DoAction在CommandBase中执行,父类引用指向子类对象
                  
                }
                return _valueCommand;
                }
            set { _valueCommand = value; }
        }

        private void ValueCommandAction(object obj)
        {
            MessageBox.Show("Test");
        }

        private bool CanExcute(object obj)
        {
            return !string.IsNullOrEmpty(MyVar);//判断是否为空
        }
    }

 

标签:ICommand,委托,CommandBase,绑定,模式,DoAction,驱动,WPF,public
From: https://www.cnblogs.com/Peretsoft/p/18444583

相关文章

  • React-测试驱动开发教程-全-
    React测试驱动开发教程(全)原文:Test-DrivenDevelopmentwithReact协议:CCBY-NC-SA4.0一、测试驱动开发的简短历史我写这一章的意图不是复制和粘贴博客中的陈词滥调(下面的摘录除外),或者假装我是历史事件的一部分(比如敏捷宣言或极限编程活动),这些事件导致了测试驱动开发......
  • wpf ObservableCollection筛选功能
    viewmodel中定义原始数据及筛选后的数据,筛选后的数据类型为ICollectionView//原始数据列表publicObservableCollection<SchoolOutDto>SchoolList{get;set;}///<summary>///筛选数据后的列表///</summary>publicICollectionViewFilterSchoolList{get;set;}......
  • 35_初识搜索引擎_multi-index&multi-type搜索模式解析以及搜索原理初步图解
    课程大纲1、multi-index和multi-type搜索模式告诉你如何一次性搜索多个index和多个type下的数据/_search:所有索引,所有type下的所有数据都搜索出来/index1/_search:指定一个index,搜索其下所有type的数据/index1,index2/_search:同时搜索两个index下的数据/1,2/_search:按照通配......
  • 操作系统:保护模式(一)GDT 与分段机制
    GDT与分段机制CPU开机时运行于实模式,寻址方式是段寄存器\(\times\)10+偏移寄存器=物理地址,主要原因是因为8086地址线和数据线不匹配导致的。但是这种寻址方式既不安全也不支持现代操作系统所需的、多任务支持、cpu特权模式等。在实模式下,对于基址,变址寻址的寄存器有明确要......
  • afl-fuzz的qemu模式中如何去判断是否crash
    1.afl-fuzz部分afl-fuzz部分和非qemu模式是相同的,主要是通过管道接收来自forkserver传入的status信息,通过status信息来判断是否存在crashif(unlikely(/*Anormalcrash/abort*/(WIFSIGNALED(fsrv->child_status))||/*specialhandling......
  • 操作系统:保护模式(二)内存模型
    平坦内存模型现代操作系统一般不会使用过于复杂的分段机制,而是采用平坦内存模型+分页模型来管理内存。平坦内存模型(FlatMemoryModel),这是现代操作系统(如Linux和Windows)常用的内存模型。在这种模型中,所有段的段基址都为0,段界限为4GB,使得整个内存空间看起来像一个连续的内......
  • 操作系统:保护模式(五)特权
    特权机制特权特权级数值越大,级别越小。通常,因为操作系统是为所有程序服务的,可靠性最高,而且必须对软硬件有完全的控制权,所以它的主体部分必须拥有特权级0,并处于整个环形结构的中心。也正是因为这样,操作系统的主体部分通常又被称做内核(Kernel、Core)。特权级1和2通常赋予那......
  • 数据设计模式一般很抽象
      Java的设计模式和其他语言的编程开发设计模式通用。设计模式分为架构模式和程序开发的设计模式。系统的架构模式分为CS架构和BS架构。单机版本的系统架构模式是继承与C/C++的开发项目软件。C/C++擅长技术的底层实现。驱动软件和操作系统也是应用程序。基于操作系统可以运......
  • 退休模式需求分析
    退休模式需求分析退休模式2+1无限链动模式详细分析:      退休模式是商城平台基于投资者用户开发的一套区块链市场投资返利方式。      投资者用户的注册额度:499元      投资者的推荐费用:100元             1指的是老板投资者  ......
  • 昇思MindSpore进阶教程--下沉模式
    大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。技术上主攻前端开发、鸿蒙开发和AI算法研究。努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧正文开始昇腾芯片集成了AICORE和AICPU等计算单元。其中AICORE负责稠密Tensor和Vector运算,AICPU负责......