wpf之mvvm基类
当我们用MVVM设计模式的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了。代码如下:
|
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
public class ViewModelBase : INotifyPropertyChanged, IDisposable{ public event PropertyChangedEventHandler PropertyChanged; public bool IsInDesignMode; /// <summary> 显示名称 </summary> public virtual string DisplayName { get; protected set; } #region 构造 public ViewModelBase() { } #endregion private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private static string GetProperyName(string methodName) { if (methodName.StartsWith("get_") || methodName.StartsWith("set_") || methodName.StartsWith("put_")) { return methodName.Substring(4); } throw new Exception(methodName + " not a method of Property"); } protected void SetProperty<T>(ref T name, T value) { if (object.Equals(name, value)) return; name = value; string propertyName = GetProperyName(new System.Diagnostics.StackTrace(true).GetFrame(1).GetMethod().Name); this.OnPropertyChanged(propertyName); } #region IDisposable Members public void Dispose() { this.OnDispose(); } /// <summary> /// 若支持IDisposable,请重写此方法,当被调用Dispose时会执行此方法。 /// </summary> protected virtual void OnDispose() { } #endregion}public class CommandBase : System.Windows.Input.ICommand{ private Action<Object> _doWork; private readonly Func<object, bool> _canExecute; /// <summary> /// 实例化一个CommandBase对象 /// </summary> /// <param name="doWork">委托一个有object类型参数的命令执行函数</param> /// <param name="canExecute">委托一个有object类型参数的命令是否能被执行的函数(可选)</param> /// <exception cref="ArgumentNullException">参数command不可以为null引用</exception> public CommandBase(Action<object> doWork, Func<object, bool> canExecute = null) { if (doWork == null) throw new ArgumentNullException("doWork"); _canExecute = canExecute; _doWork = doWork; } public bool CanExecute(Object parameter) { return true; } public void Execute(Object parameter) { if (this._doWork != null) this._doWork(parameter); } public event EventHandler CanExecuteChanged { add { } remove { } }} |
使用方式如下,例:
|
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
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class TestViewModel : ViewModelBase { public TestViewModel() { this.LoadCommand = new CommandBase((Object parameter) => Loading()); } #region 属性 private string _name; /// <summary> 是否可用 </summary> public string IsEnable { get { return _name; } set { base.SetProperty<string>(ref this._name, value); } } #endregion #region 命令 /// <summary> /// 窗口加载命令 /// </summary> public ICommand LoadCommand { get; set; } #endregion #region 方法 /// <summary> /// 初始化方法 /// </summary> public void Loading() { } #endregion } |
wpf之mvvm基类的更多相关文章
- WPF自学入门(九)WPF自定义窗口基类
今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...
- WPF开发时光之痕日记本(二)—— MVVM基类
当我们用MVVM的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了.代码如下: public class ViewModelBase : ...
- WPF之数据绑定基类
数据绑定方法 在使用集合类型作为列表控件的ItemsSource时一般会考虑使用ObservalbeCollection,它实现了INotifyCollectionChanged和INotifyPro ...
- WPF自定义窗口基类
WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...
- WPF MVVM 写一个健壮的INotifyPropertyChanged基类
当我们用MVVM的时候要实现INotifyPropertyChanged,如果你是基于.net4.5以下的framework(.net4.5已有新特性我这里就不说了) 你很可能会这么写 public ...
- WPF组件开发之组件的基类
之前在网上看到很多关于组件开发的资料,但真正可以用到框架内的却很少.今天贴出自己做的组件,并适合大部分框架的代码. 组件开发需要先做出组件的基类,然后由其他的各类组件去继承这个基类,下面是组件基类的代 ...
- 《Programming WPF》翻译 第9章 2.选择一个基类
原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ...
- WPF 窗体基类实现的体验及实现回车到下一控件
原文:WPF 窗体基类实现的体验及实现回车到下一控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jsyhello/article/details ...
- WPF 之 创建继承自Window 基类的自定义窗口基类
开发项目时,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 Window 自身的,但窗口的外边框及窗口移动.最小化等标题栏操作基本都是一样的.所以通过查看资料,可按如下方法创建继承 ...
随机推荐
- IMD中一些JS方法总结
1,日期格式化(如格式成2013-12-27 15:30,new Date().format("yyyy-MM-dd hh:mm:ss"),这种格式在safari浏览器上会出问题, ...
- 使用简介<EntityFramework6.0>
序言 在这一篇中,我们将演示EnitityFramework基本的建模[建模也是EntityFramework最核心的特性]范例,例如实体的分离和继承等.我们开始了演示如何创建一个简单的概念模型的例子 ...
- maven 速度快的镜像
<mirrors> <mirror> <id>CN</id> <name>UK Central</name> <url&g ...
- windows下mysql客户端输入中文显示??解决方法
>>>>>>>>>>>>>>>>>>>> 1.检查并修改mysql的my.ini ...
- Fragment滑动切换简单案例
Fragment的产生与介绍Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神 ...
- Haxe是何物?
最近对haxe很感兴趣,用一种语言统一所有的语言和平台,野心很大. 详细的介绍园子里已有大神发过,地址在这里:http://www.cnblogs.com/xiaotie/archive/2012/0 ...
- [DataMining]WEEK1 - text-retrieval and search engine
What does a computer have to do in order to understand a natural language sentence? What is ambiguit ...
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- ANGULAR $HTTP请求【转】
angular使用post.get向后台传参的问题 一.问题的来源 我们都知道向后台传参可以使用get.put,其形式就类似于name=jyy&id=001.但是在ng中我却发现使用$http ...
- Redis安装配置(Windows版)
近期项目中引入Redis,故记录下来,方便日后查看. 可参考(http://www.cnblogs.com/happyday56/p/3916388.html)不说废话,直奔主题. 一.安装前的准备: ...