WPF中MVVM模式下的按钮事件实现和依赖项通知

摘要:
先说按钮的事件绑定,.net中提供的ICommand就是这么用的,自己写一个command的基类,继承ICommand,实现ICommand的3个方法,最简单的实现:1publicclassCommandBase:ICommand2{3readonlyAction_excuteMethod;4//设置按钮的可用性5publicboolCanExecute6{7returntrue;8}910publiceventEventHandlerCanExecuteChanged11{12add13{14CommandManager.RequerySuggested+=value;1516}17remove18{19CommandManager.RequerySuggested-=value;20}21}2223//按钮的执行事件24publicvoidExecute25{26_excuteMethod();27}28#endregion29}ViewCode这段代码中,CanExecuteChanged是重点,注册事件和移除事件。Execute在按钮点击的时候执行,使用下边的代码,按钮的事件就绑定了。get完毕,CloseCommand绑定事件,然后执行CanExecuteChanged,注册事件。

自从上一次写MVVM入门到现在,又过了好长时间了,一直想着把事件的绑定总结一下,但是一来是认识的不够,感觉讲不清楚;二来是懒。不管了,写的不对的地方大家提一下,错误要是不暴露它就一直是错误。
先说按钮的事件绑定,.net中提供的ICommand就是这么用的,自己写一个command的基类,继承
ICommand,实现ICommand的3个方法,最简单的实现:

WPF中MVVM模式下的按钮事件实现和依赖项通知第1张WPF中MVVM模式下的按钮事件实现和依赖项通知第2张
1 public classCommandBase: ICommand
2 {
3          readonlyAction _excuteMethod;
4         //设置按钮的可用性
5         public bool CanExecute(objectparameter)
6 {
7             return true;
8 }
9 
10         public eventEventHandler CanExecuteChanged
11 {
12 add
13 {
14                 CommandManager.RequerySuggested +=value ;
15 
16 }
17 remove
18 {
19                 CommandManager.RequerySuggested -=value ;
20 }
21 }
22 
23         //按钮的执行事件
24         public void Execute(objectparameter)
25 {                       
26 _excuteMethod();
27 }
28         #endregion
29 }
View Code

这段代码中,CanExecuteChanged是重点,注册事件和移除事件。
Execute在按钮点击的时候执行,使用下边的代码,按钮的事件就绑定了。

WPF中MVVM模式下的按钮事件实现和依赖项通知第3张WPF中MVVM模式下的按钮事件实现和依赖项通知第4张
1      publicICommand CloseCommand
2 {
3             get
4 {
5                 return newCommandBase();
6 }
7         } 
View Code

但是这样,按钮是什么操作都不会做的,实现了也没有任何实际意义。在按钮点击的执行方法里面,执行了一个默认的action,action是一个委托类,所以,可以在构造的时候传一个委托的具体实现方法,构造函数加一个参数,改造一下,基类里面添加一个构造函数,然后就可以使用自己定义的方法了。

WPF中MVVM模式下的按钮事件实现和依赖项通知第5张WPF中MVVM模式下的按钮事件实现和依赖项通知第6张
1 publicCommandBase(Action excuteMethod)           
2 {
3             if (excuteMethod == null)
4 {
5                 throw newException();
6 }
7             _excuteMethod =excuteMethod;           
8 
9 }
10 
11      publicICommand CloseCommand
12 {
13             get
14 {
15                 return newCommandBase(Close);
16 }
17 } 
18          voidClose()
19 {
20              
21         }
View Code

代码写的有点啰嗦,不过,总体来说,是我认识的一个过程。
下一个问题,commandbase基类中的代码是怎么执行的?
get完毕,CloseCommand绑定事件,然后执行CanExecuteChanged,注册事件。
CanExcute是怎么执行的?输出窗口提示, 单步执行: 正在逐过程执行非用户带代码“System.Windows.Controls.Primitives.ButtonBase.HookCommand”,msdn上说这个命名空间在PresentationFramework.dll中,用reflector看了下也没找到,o(╯□╰)o,先记下这个问题。

**************************************************************************************

依赖项通知,在文字改变的时候,通知界面,主要用到INotifyPropertyChanged,定义一个
继承INotifyPropertyChanged的基类。

WPF中MVVM模式下的按钮事件实现和依赖项通知第7张WPF中MVVM模式下的按钮事件实现和依赖项通知第8张
1 public eventPropertyChangedEventHandler PropertyChanged;
2      
3 public delegate void ContextChangedEventHandler(objectsender);
4       public eventContextChangedEventHandler ContextChanged;
5      
6 protected void OnPropertyChanged(stringpropertyname)
7 
8 
9 {          
10 if (ContextChanged != null)
11 
12 
13 {
14 
15 
16 ContextChanged(propertyname);
17 
18 
19 }
20            
21 if (PropertyChanged != null)
22 
23 
24                 PropertyChanged( this, newPropertyChangedEventArgs(propertyname));
25 
26 
27         }
View Code

按钮content绑定value属性即可。

WPF中MVVM模式下的按钮事件实现和依赖项通知第9张WPF中MVVM模式下的按钮事件实现和依赖项通知第10张
1 public stringValue
2 {
3             get
4 {
5                 return_value;
6             }
View Code

本来想写一下,文字改变之后添加一个自定义的事件,想了想还是算了,在viewmodel中value的set里面直接写方法就行了,以后发现什么情况要用的话再做吧。

免责声明:文章转载自《WPF中MVVM模式下的按钮事件实现和依赖项通知》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇颜色空间Android强制设置屏幕旋转方向 Force rotation下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF中设置TEXTBOX为多行文本输入框

WPF中没有textarea的东西,不像在ASP.NET中设置textbox那样设置一个多行属性就可以变成文本域,虽然可以使用ricktextbox实现多行文本输入,但是richtextbox比较复杂,面对简单的多行文本输入的时候太麻烦了点,但是WPF的textbox依然可以通过设置属性实现像textarea一样的多行文本输入。 一下是转载的一篇出处。 本...

wpf中的窗口

wpf的窗口概念。就相当于2.0中winform中一个界面而已在wpf中窗口就是一个window类。具有图形界面这个窗口具有丰富的属性来设置自己的显示样式和外观窗口也有自己的生命周期,如图 不同的周期有不同的事件和方法可以处理很多事情。窗口激活就开始加载,然后是内容呈现。关闭窗口的时候会先引发closeing事件,在这个事件中可以阻止关闭事件进行其他处理或...

WPF中TreeView的展开 (转)

http://blog.163.com/qiulei_21/blog/static/35071722201122452818390/ 在网上找了很多资料,但是都是云山雾绕的,看了很久看不懂,今天终于在我同事的帮助下搞定了,要充分利用TreeViewItem的IsExpanded属性啊。 任务:树节点的展开,包括全展开,点击节点的展开,某一层节点的展开。...

WPF 中实现 Winfrom 中 Application.DoEvents() 方法

熟悉 Winfrom 中 Application.DoEvents() 方法的朋友一定用过此方法,此方法可以立即处理当前在消息队列中的所有 Windows 消息。 如在一个按钮单击事件中,需要每一秒改变label的Text属性,如下代码:      privatevoid button1_Click(object sender, EventArgs...

WPF Dispatcher.BeginInvoke子线程更新UI

在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象。“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者Invoke()方法。 Dispatcher.BeginInvoke() //异步执行,不等待委托结束就更新 Dispatcher.Invoke()     ...

WPF委托实现方法回调(刷新父窗体)

MainWindow.xaml(父窗体) <StackPanel> <Label Content="{Binding Message}"/> <Button Content="Input User Name" Command="{Binding OpenSubWindowCommand}"/> </...