2014-10-10 43 views
0

我正在阅读这个http://msdn.microsoft.com/en-us/magazine/jj651572.aspx来学习mvvm light框架。 我下载了源代码Friend.cs。Set()和RaisePropertyChanged()之间的差异

我的问题是为什么不同属性的一些设置方法实现不同。

例如,名字的setter是,为什么我需要'ref'关键字为_firstName。

Set(FirstNamePropertyName, ref _firstName, value); 

而对于DateOfBirthString设置器为“

RaisePropertyChanged(() => DateOfBirth); 

何时会LINQ表达式将被评估?

namespace MyFriends.Model 
{ 
    [SimpleSerialize] 
    public class Friend : ObservableObject 
    { 
     /// <summary> 
     /// The <see cref="FirstName" /> property's name. 
     /// </summary> 
     public const string FirstNamePropertyName = "FirstName"; 

     private string _firstName; 

     /// <summary> 
     /// Sets and gets the FirstName property. 
     /// Changes to that property's value raise the PropertyChanged event. 
     /// </summary> 
     [SimpleSerialize(FieldName = "first_name")] 
     public string FirstName 
     { 
      get 
      { 
       return _firstName; 
      } 
      set 
      { 
       Set(FirstNamePropertyName, ref _firstName, value); 
      } 
     } 

     /// <summary> 
     /// The <see cref="LastName" /> property's name. 
     /// </summary> 
     public const string LastNamePropertyName = "LastName"; 

     private string _lastName; 

     /// <summary> 
     /// Sets and gets the LastName property. 
     /// Changes to that property's value raise the PropertyChanged event. 
     /// </summary> 
     [SimpleSerialize(FieldName = "last_name")] 
     public string LastName 
     { 
      get 
      { 
       return _lastName; 
      } 
      set 
      { 
       Set(LastNamePropertyName, ref _lastName, value); 
      } 
     } 

     /// <summary> 
     /// The <see cref="DateOfBirth" /> property's name. 
     /// </summary> 
     public const string DateOfBirthPropertyName = "DateOfBirth"; 

     private string _dateOfBirthString; 

     /// <summary> 
     /// Sets and gets the DateOfBirth property. 
     /// Changes to that property's value raise the PropertyChanged event. 
     /// </summary> 
     [SimpleSerialize(FieldName = "birthday")] 
     public string DateOfBirthString 
     { 
      get 
      { 
       return _dateOfBirthString; 
      } 
      set 
      { 
       _dateOfBirthString = value; 
       RaisePropertyChanged(() => DateOfBirth); 
      } 
     } 

     public DateTime DateOfBirth 
     { 
      get 
      { 
       if (string.IsNullOrEmpty(_dateOfBirthString)) 
       { 
        return DateTime.MinValue; 
       } 

       return DateTime.ParseExact(DateOfBirthString, "d", CultureInfo.InvariantCulture); 
      } 
      set 
      { 
       _dateOfBirthString = value.ToString("d", CultureInfo.InvariantCulture); 
      } 
     } 

     private string _imageUrl; 

     [SimpleSerialize(FieldName = "picture")] 
     public string ImageUrl 
     { 
      get 
      { 
       return _imageUrl; 
      } 
      set 
      { 
       _imageUrl = value; 
       RaisePropertyChanged(() => ImageUri); 
      } 
     } 

     public Uri ImageUri 
     { 
      get 
      { 
       return new Uri(_imageUrl); 
      } 
     } 
    } 
} 

回答

2

这两种方法之间的区别在于,Set方法取代_firstName字段的旧值,然后引发PropertyChanged事件,而RaisePropertyChanged仅引发PropertyChanged事件。

你要使用在大多数情况下Set方法,因为它有助于通过包装所有,通常需要在只有一个方法属性的setter内完成,以缩短属性声明:

  1. 它更新传递字段的值并用value的内容覆盖它,然后
  2. 引发PropertyChanged事件以通知有关此更新的视图。

原因领域需要通过引用传递(因此使用ref _firstName)是不是字段的内容所需要的Set方法中,但该字段本身实际上被更新。

当一个属性的更新也影响其他属性时,RaisePropertyChanged方法很有用。在这种情况下,这些属性的内容需要手动更新,然后可以调用RaisePropertyChanged方法来通知视图哪些属性实际发生了更改。