[Silverlight入门系列]使用MVVM模式(3):Model的INotifyPropertyChanged接口实现
當客戶端綁定一個數據模型以后,數據模型變化以后可以自動通知客戶端更新界面顯示,這就是INotifyPropertyChanged接口要做的工作。INotifyPropertyChanged?接口用于向客戶端(通常是執行綁定的客戶端)發出某一屬性值已更改的通知。例如,考慮一個帶有名為?FirstName?屬性的?Person?對象。?若要提供一般性屬性更改通知,則?Person?類型實現INotifyPropertyChanged?接口并在?FirstName?更改時引發?PropertyChanged?事件。?若要在將客戶端與數據源進行綁定時發出更改通知,則綁定類型應具有下列功能:實現INotifyPropertyChanged接口。
?當綁定的屬性改變時,它可以通知客戶端,并進行界面數據更新。而我們不用寫很多復雜的代碼來更新界面數據,這樣可以做到方法簡潔而清晰,松耦合和讓方法變得更通用。可用的地方太多了:例如上傳進度,實時后臺數據變更等地方。
(另:對于集合Model:INotifyCollectionChanged結接口會有ObservableCollection自動實現(見上一篇))
?
一個簡單的例子:(下面的例子中TextBlock綁定了DataContext的ModelName,點擊按鈕以后model更新,TextBlock會自動更新)
Model:?
1 public class MyModel : INotifyPropertyChanged2 {
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 : INotifyPropertyChanged2 {
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 }
轉載于:https://www.cnblogs.com/Areas/archive/2011/09/07/2169875.html
總結
以上是生活随笔為你收集整理的[Silverlight入门系列]使用MVVM模式(3):Model的INotifyPropertyChanged接口实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 按指定字段自定义列表排序
- 下一篇: 如何在CentOS 5.5上安装Kipp