gpt4 book ai didi

mvvm - Set()和RaisePropertyChanged()之间的区别

转载 作者:行者123 更新时间:2023-12-03 10:55:07 25 4
gpt4 key购买 nike

我正在阅读此http://msdn.microsoft.com/en-us/magazine/jj651572.aspx以学习mvvm light框架。
我下载了源代码Friend.cs。

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

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

 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);
}
}
}
}

最佳答案

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

在大多数情况下,您将需要使用Set方法,因为它通过将通常需要完成的所有操作包装在一个属性的setter中,从而有助于缩短属性声明:

  • 它更新传递的字段的值,并用value的内容覆盖它,然后使用
  • 引发PropertyChanged事件,以向Views通知此更新。

  • 该字段需要通过引用传递的原因(因此使用 ref _firstName)是因为 Set方法中不需要字段的内容,而是实际更新了字段。

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

    关于mvvm - Set()和RaisePropertyChanged()之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26293193/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com