在 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)