我正在编写一个应用程序来读取表单上的信息,并根据一组规则以各种方式转换该数据。我不会深入了解情景的原因,而只是列出我想要做的事情的基本例子。请注意,使用PropertyChangedEventHandler和INotifyPropertyChanged的整个业务对我来说都是新的,我仍然在阅读和了解它。
这是一个示例类,用于捕获名字和给用户的消息:
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 属性中的值。
例如,用户键入 John ,因此设置了 nameMessage 属性 Hello John 。
这是我想要完成的一个非常简单的例子,但是我遇到了困难,因为我很难理解如何获得指向该索引的特定属性的指针。
以下是我的两个问题: 1)我应该编写什么代码来获取更改的值并进行修改? 2)该业务逻辑是否属于该类,还是应该完全属于不同的类?
您可以提供的任何指示都非常有帮助。
谢谢。
答案 0 :(得分:1)
要将属性级联到另一个属性,您可以实现您的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)