当我们用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
}
|