在 PropertyChangedEventHandler 期间修改属性的值

本文关键字:属性 修改 PropertyChangedEventHandler | 更新日期: 2023-09-27 18:32:34

我正在编写一个应用程序,该应用程序读取表单上的信息并根据一组规则以各种方式转换该数据。我不会深入讨论场景的原因,我只会列出一个我正在尝试做的事情的基本示例。请注意,使用 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 属性 你好约翰

这是我试图完成的一个非常简单的示例,但我陷入了困境,因为我很难理解如何获取指向该索引的特定属性的指针。

这是我的两个问题:1(我应该写什么代码来获取更改的值并对其进行修改?2(该业务逻辑是否属于类,还是应该完全属于不同的类?

您可以提供的任何指针都将非常有帮助。

谢谢。

在 PropertyChangedEventHandler 期间修改属性的值

要将一个属性从一个级联到另一个属性,您可以像这样实现您的 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);
       }
    } 
}

您也可以执行此操作,而无需将名称消息实际存储为字段。 它可以即时生成:

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)