博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Silverlight入门系列]使用MVVM模式(4):Prism的NotificationObject自动实现INotifyPropertyChanged接口...
阅读量:4324 次
发布时间:2019-06-06

本文共 2875 字,大约阅读时间需要 9 分钟。

在写了Model的接口实现,在Prism中有一个NotificationObject自动实现了这个接口,位于Microsoft.Practices.Prism.ViewModel命名空间下。也就是说,Prism推荐ViewModel继承这个NotificationObject类来自动实现INotifyPropertyChanged接口。看看NotificationObject都有啥:

1
public
abstract
class
NotificationObject : INotifyPropertyChanged
2
{
3
protected
NotificationObject();
4
5
protected
void
RaisePropertyChanged
<
T
>
(Expression
<
Func
<
T
>>
propertyExpression);
6
protected
void
RaisePropertyChanged(
params
string
[] propertyNames);
7
protected
virtual
void
RaisePropertyChanged(
string
propertyName);
8
}

提供了几个很方面的接口,调用更方便了,例如:

1
public
string
ModelName
2
{
3
get
{
return
_ModelName; }
4
set
5
{
6
_ModelName
=
value;
7
8
RaisePropertyChanged(
"
ModelName
"
);
9
10
}
11
}

第二个RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression);是一个表达式,编译为一个,返回一个T类型。

例如可以这样用:

1
this
.RaisePropertyChanged(()
=>
this
.MyDataSummary);

ViewModel的INotifyPropertyChanged接口和Model的INotifyPropertyChanged接口

ViewModel和Model它们二者都实现INotifyPropertyChanged接口并不矛盾。用途不一样。例如一个ViewModel可以包含多个其它的ViewModel,而它们有一个整体的HasChanged属性来标识是否有改变。这个时候这个整体的ViewModel的HasChanged属性就可以用整体的INotifyPropertyChanged,而局部的INotifyPropertyChanged实现了这个整体的INotifyPropertyChanged。看个例子:

1
using
Microsoft.Practices.Prism.ViewModel;
2
3
 
public
class
MyViewModel3: NotificationObject
4
{
5
public
MyModel MyModelData {
get
;
set
; }
6
public
MyModel2 MyModelData2 {
get
;
set
; }
7
8
public
bool
HasChanges {
get
;
set
; }
9
public
bool
CanSave {
get
;
set
; }
10
11
public
MyViewModel3(MyModel model, MyModel2 model2)
12
{
13
MyModelData
=
model;
14
MyModelData2
=
model2;
15
16
model.PropertyChanged
+=
this
.OnPropertyChanged;
17
}
18
19
private
void
OnPropertyChanged(
object
sender, PropertyChangedEventArgs args)
20
{
21
if
(args.PropertyName
==
"
Name
"
)
22
{
23
this
.HasChanges
=
true
;
24
this
.RaisePropertyChanged(()
=>
this
.CanSave);
25
}
26
}
27
}
28
29
 
public
class
MyModel2 : INotifyPropertyChanged
30
{
31
public
event
PropertyChangedEventHandler PropertyChanged;
32
33
public
int
ModelID {
get
;
set
; }
34
35
private
string
_ModelName;
36
public
string
ModelName
37
{
38
get
{
return
_ModelName; }
39
set
40
{
41
_ModelName
=
value;
42
43
if
(PropertyChanged
!=
null
)
44
{
45
PropertyChanged(
this
,
new
PropertyChangedEventArgs(
"
ModelName
"
));
46
}
47
}
48
}
49
}
50
51
public
class
MyModel : INotifyPropertyChanged
52
{
53
public
event
PropertyChangedEventHandler PropertyChanged;
54
55
public
int
ModelID {
get
;
set
; }
56
57
private
string
_ModelName;
58
public
string
ModelName
59
{
60
get
{
return
_ModelName; }
61
set
62
{
63
_ModelName
=
value;
64
65
if
(PropertyChanged
!=
null
)
66
{
67
PropertyChanged(
this
,
new
PropertyChangedEventArgs(
"
ModelName
"
));
68
}
69
}
70
}
71
}

此外,Validation既可以放在Model里面也可以放在ViewModel里面,看你的规则是否简单,是否涉及业务逻辑,有的复杂的业务逻辑validation的需要调用后台service的建议放到ViewModel中去做。

转载于:https://www.cnblogs.com/Areas/archive/2011/09/07/2169876.html

你可能感兴趣的文章
创建WPF项目
查看>>
电源模块的PCB设计
查看>>
光猫与普通的家用猫
查看>>
Asp.Net 构架(Http Handler 介绍) - Part.2
查看>>
6.11 spring框架
查看>>
Python--eval()函数
查看>>
【转载】Linux下的crontab定时执行任务命令
查看>>
STM32 HAL库的定时器中断回调函数跟串口中断回调函数
查看>>
vs2010找不到ado.net 实体数据模型解决办法
查看>>
(转)深入理解javascript连续赋值表达式
查看>>
用户场景分析
查看>>
MySQL创建数据库及用户
查看>>
Springboot静态页面放在static路径下还是访问不到
查看>>
centos7 重启网卡失败
查看>>
springboot(一)注解
查看>>
07 Mybatis的多表查询1----1对多和多对1
查看>>
debian和ubuntu的sh dash bash
查看>>
java9-8 局部内部类
查看>>
数据库分页
查看>>
Centos6.8源码编译安装PHP7
查看>>