当客户端绑定一个数据模型以后,数据模型变化以后可以自动通知客户端更新界面显示,这就是INotifyPropertyChanged接口要做的工作。INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知。例如,考虑一个带有名为 FirstName 属性的 Person 对象。 若要提供一般性属性更改通知,则 Person 类型实现 INotifyPropertyChanged 接口并在 FirstName 更改时引发 PropertyChanged 事件。 若要在将客户端与数据源进行绑定时发出更改通知,则绑定类型应具有下列功能:实现INotifyPropertyChanged接口。
当绑定的属性改变时,它可以通知客户端,并进行界面数据更新。而我们不用写很多复杂的代码来更新界面数据,这样可以做到方法简洁而清晰,松耦合和让方法变得更通用。可用的地方太多了:例如上传进度,实时后台数据变更等地方。
(另:对于集合Model:INotifyCollectionChanged结接口会有ObservableCollection自动实现(见上一篇))
一个简单的例子:(下面的例子中TextBlock绑定了DataContext的ModelName,点击按钮以后model更新,TextBlock会自动更新)
Model:
1 public class MyModel : INotifyPropertyChanged
2 {
3 public event PropertyChangedEventHandler PropertyChanged;
4
5 public int ModelID { get; set; }
6
7 private string _ModelName;
8 public string ModelName
9 {
10 get { return _ModelName; }
11 set
12 {
13 _ModelName = value;
14
15 if (PropertyChanged != null)
16 {
17 PropertyChanged(this, new PropertyChangedEventArgs("ModelName"));
18 }
19 }
20 }
21 }
Silverlight页面:
1 <Grid x:Name="LayoutRoot" Background="White">
2 <TextBlock Height="46" HorizontalAlignment="Left" Margin="187,51,0,0" Name="textBlock1" Text="{Binding ModelName}" VerticalAlignment="Top" Width="94" />
3 <Button Content="update" Height="39" HorizontalAlignment="Left" Margin="187,120,0,0" Name="button1" VerticalAlignment="Top" Width="106" Click="button1_Click" />
4 </Grid>
页面代码:
1 public MyView()
2 {
3 InitializeComponent();
4
5 MyModel m1 = new MyModel() { ModelID = 1, ModelName = "abc" };
6
7 this.DataContext = m1;
8 }
9
10 private void button1_Click(object sender, RoutedEventArgs e)
11 {
12 (this.DataContext as MyModel).ModelName = "abc_changed";
13 }
甚至还有一个VS2010插件来完成这个工作:NotifyPropertyWeaver
ViewModel也可以实现INotifyPropertyChanged接口,很简单:
XAML绑定集合:
1 <DataGrid ItemsSource="{Binding Path=LineItems}" />
ViewModel代码:
1 public class OrderViewModel : INotifyPropertyChanged
2 {
3 public OrderViewModel( IOrderService orderService )
4 {
5 this.LineItems = new ObservableCollection<OrderLineItem>(
6 orderService.GetLineItemList() );
7 }
8
9 public ObservableCollection<OrderLineItem> LineItems { get; private set; }
10 }
分享到:
相关推荐
如何创建更好的Silverlight程序系列课程(3):Silverlight & MVVM
"MVVM in Delphi: Architecting and Building Model View ViewModel Applications" 2016 | ISBN-10: 148422213X | 143 pages | PDF, EPUB | 23 MB Dive into the world of MVVM, learn how to build modern ...
主要对mvvm框架的设计ICommand和INotifyPropertyChanged接口的使用
Model就是数据结构,ViewModel实现算法数据处理,View实现数据展现。 View:UI界面 ViewModel:它是View的抽象,负责View与Model之间信息转换,将View的Command传送到Model; Model:数据层 View与ViewModule连接...
Silverlight MVVM模式Silverlight MVVM模式Silverlight MVVM模式
实现mvvm模式 Silverlight
iOS, MVVM 设计模式, MVVM, 设计模式的一个小 demo
关键代码:实现接口INotifyPropertyChanged 2)ViewModel:定义算法操作数据结构(数据集合,增加,删除,修改,查询) 关键代码:继承ViewModelBase 定义一个集合ObservableCollection<c401xmmc> C401xmmcs 3)...
silverlight 中mvvm 的使用详解
[Packt Publishing] 企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) (英文版) [Packt Publishing] MVVM Survival Guide for Enterprise Architectures in Silverlight and WPF (E-Book) ☆ 出版信息:☆ ...
该资源使用MVVM编程模式,页面与逻辑分离的情况下,我们改动其中任何一个部分都是比较清楚的。
Wpf Mvvm模式下窗口ShowDialog的实现
Silverlight中MVVM(Model_ViewModel_View)设计模式的经典实例 Silverlight无数设计师最钟爱的设计模式 Silverlight设计的王者模式 Silverlight设计的首选模式
MVVM模式实现图片分页显示 (1)数据使用WCF服务加载 ...(3)采用MVVM模式实现分页 注意:在运行前需要修改WCF服务Service1.svc方法GetAllPictureData中的图片文件夹路径,默认是C:\Users\My_PC\Pictures\picture
MVVM设计模式简单案例,本案例分为多层实现,适合初学者使用。
silverlight MVVM模式示例。针对MVVM的特性与特点写的一个小例子,适合初学者参考。
用MVVM模式做的silverlight自定义日历,可以绑定其他数据,做成进度管理日历或者考勤表
Silverlight中使用MVVM.pdf