zoukankan      html  css  js  c++  java
  • [Silverlight入门系列]使用MVVM模式(4):Prism的NotificationObject自动实现INotifyPropertyChanged接口

    上一篇写了Model的INotifyPropertyChanged接口实现,在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);是一个表达式,编译为一个Func委托,返回一个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中去做。

    Powered By D&J (URL:http://www.cnblogs.com/Areas/)
  • 相关阅读:
    执行 apt-get -f install 提示错误
    Git 命令总结
    git版本控制(一)
    ubuntu设置字体编码GBK和UTF-8
    Method and system for public-key-based secure authentication to distributed legacy applications
    T-SQL 实用函数总结
    T-SQL 实用函数总结
    在程序员面前千万不要说这9句话,我一个同事就死的很惨!
    在程序员面前千万不要说这9句话,我一个同事就死的很惨!
    在程序员面前千万不要说这9句话,我一个同事就死的很惨!
  • 原文地址:https://www.cnblogs.com/Areas/p/2169876.html
Copyright © 2011-2022 走看看