在 PropertyChangedEventHandler 期间修改 a 属性 的值
Modify the value of a property during PropertyChangedEventHandler
我正在编写一个应用程序,它读取表单上的信息并根据一组规则以各种方式转换该数据。我不会深入探讨场景的原因,而只是列出一个我正在尝试做的事情的基本示例。请注意,使用 PropertyChangedEventHandler 和 INotifyPropertyChanged 的整个业务对我来说是非常新的,我仍在阅读和学习它。
这是一个 示例 class 我用来捕获名字和给用户的消息:
class Names : INotifyPropertyChanged
{
private string _firstName;
public string firstName { get { return _firstName; } set { SetField(ref _firstName, value, "firstName"); } }
private string _nameMessage;
public string nameMessage { get { return _nameMessage; } set { SetField(ref _nameMessage, value, "nameMessage"); } }
#region handle property changes
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetField<T>(ref T field, T value, string propertyName)
{
//if the value did not change, do nothing.
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
//the value did change, so make the modification.
field = value;
OnPropertyChanged(propertyName);
return true;
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
每当 firstName 的 属性 改变时,我想自动修改 nameMessage 中的值 属性.
For example, the user types John, so the nameMessage property is set
to Hello John.
这是我试图完成的一个非常简单的示例,但我被卡住了,因为我很难理解如何获取指向该索引的特定 属性 的指针。
这是我的两个问题:
1)我应该写什么代码来获取更改后的值并进行修改?
2) 该业务逻辑属于 class,还是应该完全属于不同的 class?
您能提供的任何指示都会很有帮助。
谢谢。
要将 属性 从一个级联到另一个,您可以实现您的 firstName 属性,如下所示:
public string firstName
{
get { return _firstName; }
set
{
if (SetField(ref _firstName, value))
{
// first name changed, so update the other field too
this.nameMessage = string.Format("hello {0}", _firstName);
}
}
}
您也可以在不将 nameMessage 实际存储为字段的情况下执行此操作。它可以即时生成:
public string nameMessage { get { return string.Format("hello {0}", _firstName); } }
并简单地为名字 setter 添加一个额外的 属性 更改通知:
set
{
if (SetField(ref _firstName, value))
{
// first name changed, so update the other field too
NotifyPropertyChanged("nameMessage");
}
}
相关:一个技巧是使用 CallerMemberName
注释为 属性 名称提供默认值,因此您不必在 setfield
调用中传递它
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
我正在编写一个应用程序,它读取表单上的信息并根据一组规则以各种方式转换该数据。我不会深入探讨场景的原因,而只是列出一个我正在尝试做的事情的基本示例。请注意,使用 PropertyChangedEventHandler 和 INotifyPropertyChanged 的整个业务对我来说是非常新的,我仍在阅读和学习它。
这是一个 示例 class 我用来捕获名字和给用户的消息:
class Names : INotifyPropertyChanged
{
private string _firstName;
public string firstName { get { return _firstName; } set { SetField(ref _firstName, value, "firstName"); } }
private string _nameMessage;
public string nameMessage { get { return _nameMessage; } set { SetField(ref _nameMessage, value, "nameMessage"); } }
#region handle property changes
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetField<T>(ref T field, T value, string propertyName)
{
//if the value did not change, do nothing.
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
//the value did change, so make the modification.
field = value;
OnPropertyChanged(propertyName);
return true;
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
每当 firstName 的 属性 改变时,我想自动修改 nameMessage 中的值 属性.
For example, the user types John, so the nameMessage property is set to Hello John.
这是我试图完成的一个非常简单的示例,但我被卡住了,因为我很难理解如何获取指向该索引的特定 属性 的指针。
这是我的两个问题: 1)我应该写什么代码来获取更改后的值并进行修改? 2) 该业务逻辑属于 class,还是应该完全属于不同的 class?
您能提供的任何指示都会很有帮助。
谢谢。
要将 属性 从一个级联到另一个,您可以实现您的 firstName 属性,如下所示:
public string firstName
{
get { return _firstName; }
set
{
if (SetField(ref _firstName, value))
{
// first name changed, so update the other field too
this.nameMessage = string.Format("hello {0}", _firstName);
}
}
}
您也可以在不将 nameMessage 实际存储为字段的情况下执行此操作。它可以即时生成:
public string nameMessage { get { return string.Format("hello {0}", _firstName); } }
并简单地为名字 setter 添加一个额外的 属性 更改通知:
set
{
if (SetField(ref _firstName, value))
{
// first name changed, so update the other field too
NotifyPropertyChanged("nameMessage");
}
}
相关:一个技巧是使用 CallerMemberName
注释为 属性 名称提供默认值,因此您不必在 setfield
调用中传递它
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)