在PropertyChangedEventHandler

时间:2016-01-29 23:19:53

标签: c# class inotifypropertychanged

我正在编写一个应用程序来读取表单上的信息,并根据一组规则以各种方式转换该数据。我不会深入了解情景的原因,而只是列出我想要做的事情的基本例子。请注意,使用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)该业务逻辑是否属于该类,还是应该完全属于不同的类?

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

谢谢。

1 个答案:

答案 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)