WPF ICommand 用法

基础类,继承与ICommand接口

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Windows.Input;
  6
  7 namespace WpfExample
  8 {
  9     public class RelayCommand : ICommand
 10     {
 11         #region Fields
 12
 13         /// <summary>
 14         /// Encapsulated the execute action
 15         /// </summary>
 16         private Action<object> execute;
 17
 18         /// <summary>
 19         /// Encapsulated the representation for the validation of the execute method
 20         /// </summary>
 21         private Predicate<object> canExecute;
 22
 23         #endregion // Fields
 24
 25         #region Constructors
 26
 27         /// <summary>
 28         /// Initializes a new instance of the RelayCommand class
 29         /// Creates a new command that can always execute.
 30         /// </summary>
 31         /// <param name="execute">The execution logic.</param>
 32         public RelayCommand(Action<object> execute)
 33             : this(execute, DefaultCanExecute)
 34         {
 35         }
 36
 37         /// <summary>
 38         /// Initializes a new instance of the RelayCommand class
 39         /// Creates a new command.
 40         /// </summary>
 41         /// <param name="execute">The execution logic.</param>
 42         /// <param name="canExecute">The execution status logic.</param>
 43         public RelayCommand(Action<object> execute, Predicate<object> canExecute)
 44         {
 45             if (execute == null)
 46             {
 47                 throw new ArgumentNullException("execute");
 48             }
 49
 50             if (canExecute == null)
 51             {
 52                 throw new ArgumentNullException("canExecute");
 53             }
 54
 55             this.execute = execute;
 56             this.canExecute = canExecute;
 57         }
 58
 59         #endregion // Constructors
 60
 61         #region ICommand Members
 62
 63         /// <summary>
 64         /// An event to raise when the CanExecute value is changed
 65         /// </summary>
 66         /// <remarks>
 67         /// Any subscription to this event will automatically subscribe to both
 68         /// the local OnCanExecuteChanged method AND
 69         /// the CommandManager RequerySuggested event
 70         /// </remarks>
 71         public event EventHandler CanExecuteChanged
 72         {
 73             add
 74             {
 75                 CommandManager.RequerySuggested += value;
 76                 this.CanExecuteChangedInternal += value;
 77             }
 78
 79             remove
 80             {
 81                 CommandManager.RequerySuggested -= value;
 82                 this.CanExecuteChangedInternal -= value;
 83             }
 84         }
 85
 86         /// <summary>
 87         /// An event to allow the CanExecuteChanged event to be raised manually
 88         /// </summary>
 89         private event EventHandler CanExecuteChangedInternal;
 90
 91         /// <summary>
 92         /// Defines if command can be executed
 93         /// </summary>
 94         /// <param name="parameter">the parameter that represents the validation method</param>
 95         /// <returns>true if the command can be executed</returns>
 96         public bool CanExecute(object parameter)
 97         {
 98             return this.canExecute != null && this.canExecute(parameter);
 99         }
100
101         /// <summary>
102         /// Execute the encapsulated command
103         /// </summary>
104         /// <param name="parameter">the parameter that represents the execution method</param>
105         public void Execute(object parameter)
106         {
107             this.execute(parameter);
108         }
109
110         #endregion // ICommand Members
111
112         /// <summary>
113         /// Raises the can execute changed.
114         /// </summary>
115         public void OnCanExecuteChanged()
116         {
117             EventHandler handler = this.CanExecuteChangedInternal;
118             if (handler != null)
119             {
120                 //DispatcherHelper.BeginInvokeOnUIThread(() => handler.Invoke(this, EventArgs.Empty));
121                 handler.Invoke(this, EventArgs.Empty);
122             }
123         }
124
125         /// <summary>
126         /// Destroys this instance.
127         /// </summary>
128         public void Destroy()
129         {
130             this.canExecute = _ => false;
131             this.execute = _ => { return; };
132         }
133
134         /// <summary>
135         /// Defines if command can be executed (default behaviour)
136         /// </summary>
137         /// <param name="parameter">The parameter.</param>
138         /// <returns>Always true</returns>
139         private static bool DefaultCanExecute(object parameter)
140         {
141             return true;
142         }
143     }
144 }

在VM中绑定对应命令的方法

 1   public ICommand ToggleExecuteCommand { get;set; }//前台绑定的命令
 2         public ICommand HiButtonCommand { get; set; }//前台绑定的命令
 3
 4         public MainWindowViewModel()
 5         {
 6             HiButtonCommand = new RelayCommand(ShowMessage,CanExecute2);//初始化命令调用的方法
 7             ToggleExecuteCommand = new RelayCommand(ChangeCanExecute);//初始化命令调用的方法
 8         }
 9
10         private bool CanExecute2(object obj)//调用的方法体函数
11         {
12             return true;
13         }
14
15         public void ShowMessage(object obj)//调用的方法体函数
16         {
17             MessageBox.Show(obj.ToString());
18         }
19
20         public void ChangeCanExecute(object obj)//调用的方法体函数
21         {
22             //
23         }
时间: 2024-11-25 19:54:30

WPF ICommand 用法的相关文章

WPF DataTriger 用法示例代码

用法1: <DataGridTemplateColumn Header="{lex:LocText ExamineRoom}"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Name="tb" Text="{Binding ExamineRoom}"> </TextBlock> <DataTempl

WPF中StringFormat的用法

原文:WPF中StringFormat的用法 WPF中StringFormat的用法可以参照C#中string.Format的用法 1. C#中用法: 格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元)示例: string.Format("{0:C}",0.2) 结果为:¥0.10 (英文操作系统结果:$0.10) 默认格式化小数点后面保留两位小数,如果需要保留一位或者更多,可以指定位数string.Format("{0:C1}",10.0

WPF 原生绑定和命令功能使用指南

WPF 原生绑定和命令功能使用指南 魏刘宏 2020 年 2 月 21 日 如今,当谈到 WPF 时,我们言必称 MVVM.框架(如 Prism)等,似乎已经忘了不用这些的话该怎么使用 WPF 了.当然,这里说的不用框架和 MVVM,并不是说像使用 Winform 那样使用 WPF,而是追本溯源,重识 WPF 与生俱来的绑定和命令的风采. 一.绑定的使用 目标:前台页面通过绑定获取后台属性的值. 这个目标实际上分为两部分,一是前台获取后台的属性值,二是属性值变动后能够及时体现出来. 要实现目标的

WPF之MVVM(Step2)&mdash;&mdash;自己实现DelegateCommand:ICommand

在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类.此篇主要介绍DelegateCommand来解决上面所遇到的问题. 首先,我们创建自己的DelegateCommand. 代码如下: /// <summary> /// 实现DelegateCommand /// </summary> class MyDelegateCommand : ICommand { /// <summary> /// 命令

WPF从我炫系列4---装饰控件的用法

这一节的讲解中,我将为大家介绍WPF装饰控件的用法,主要为大家讲解一下几个控件的用法. ScrollViewer滚动条控件 Border边框控件 ViewBox自由缩放控件 1. ScrollViewer滚动条控件 大家知道在WPF中的一些布局控件中是不带滚动条的,如果里面的内容控件超过了外面布局控件的大小,就不能完全被显示出来,这个时候我们就可以使用滚动条控件,让它滚动显示. 效果图: 默认情况下ScrollViewer是显示垂直滚动条的.但是可以通过属性来控制滚动条的显示. Horizont

WPF之MVVM(Step1)&mdash;&mdash;自己实现ICommand接口

开发WPF应用程序,就不得不提MVVM.下面偶将展示MVVM中简单的实现,其中主要在于ICommand的实现上,不过这种实现方式,应该不会有多少人在开发中使用,在此仅作学习使用. 准备: 界面绘制,简单的以一个输入框TextBox和一个按钮Button组成.   入手 接下来写ViewModel,注意其中ViewModel需要继承接口INotifyPropertyChanged,其主要功能是保证后台属性改变能够通知到前台改变. class TestViewModel : INotifyPrope

WPF的ListView控件自定义布局用法实例

本文实例讲述了WPF的ListView控件自定义布局用法.分享给大家供大家参考,具体如下: 概要: 以源码的形式贴出,免得忘记后,再到网上查资料.在VS2008+SP1环境下调试通过 引用的GrayscaleEffect模块,可根据参考资料<Grayscale Effect...>中的位置下载. 正文: 如何布局是在App.xaml中定义源码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

wpf中INotifyPropertyChanged的用法

using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using

转:WPF中ListBox的创建和多种绑定用法

先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox Margin="10,10,0,13" Name="listBox1" HorizontalAlignment="Left"         VerticalAlignment="Top" Width="194"