PropertyChangedEventHandler如何获得价值?

时间:2012-11-08 17:42:11

标签: c# inotifypropertychanged

所以我将事件设置为类

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    }

当一个类的属性发生变化时它会被触发,但是我想在类似的类中进行相同的更改。以此为例

class A: INotifyPropertyChanged
{
   //event handler declaration

   string PhoneNumber;

   string _name;
   Public string Name {
     get { return _name;}
     set { _name = value; PropertyChanged("Name");}
   }
}

class B
{
   string Name;
   int age;
}

和A类的事件绑定;

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    }

我想要的是复制A的Name属性的内容并将其分配给B的实例。

这样做的优雅方法是什么?我的问题是知道A的哪个值发生了变化(在我的课堂上它不仅仅是名字,而是更多)。

2 个答案:

答案 0 :(得分:5)

使用PropertyName attribute of the PropertyChangeEventArgs找出修改了哪个属性,然后使用一些逻辑将该属性设置为,我正在调用的内容为boundItems

如果需要,可以使用sender对象并将其强制转换为适当的类型,这样可以提高灵活性。使用Reflection将允许您通过仅使用String的{​​{1}}值来获取和设置属性而不会涉及真正的手工劳动,但是它的开销更大,所以如果你是做了很多,我建议不要这样做。

PropertyName

或者,您可以使用Reflection来设置属性,而不是构建switch case。

void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch(e.PropertyName)
    {
        case "Name":
            //You Code
            boundItem.Name = (sender as A).Name;
            break;
    } 
}

但是,最好的选择是创建具有内置于对象属性中的这些关系的类。修改属性的void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { //Untested Reflection example. Probably needs some modifying. PropertyInfo prop = typeof(A).GetType() .GetProperty(e.PropertyName, BindingFlags.Public | BindingFlags.Instance); PropertyInfo boundProp = typeof(B).GetType() .GetProperty(e.PropertyName, BindingFlags.Public | BindingFlags.Instance); boundProp.SetValue (boundItem, prop.GetValue((sender as A),0), null); } get以同时设置受影响的属性和set属性。这看起来像这样:

boundItems

答案 1 :(得分:0)

您必须使用Reflection,示例代码将如下所示

public class SomeClass : INotifyPropertyChanged
{

    public void OnPropertyChanged(string propertyName , object before, object after)
    {
        Type type = this.GetType();
        var val = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(this, null); //Contains changed value 
        if (propertyName == "Name) {
           //Do whatever you want to do with value for "Name"
        }
    }
}