6

所以我已经将事件设置为一个类

    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 的哪个值发生了变化(在我的班级中,它不仅是名称,而且还有更多)。

4

2 回答 2

9

使用 PropertyChangeEventArgs 的PropertyName 属性来确定修改了哪个属性,然后使用一些逻辑将该属性设置为我正在调用的boundItems.

如果需要,您也可以使用 sender 对象并将其转换为适当的类型,这样可以提供更多的灵活性。Using将允许您通过仅使用 的值Reflection来获取和设置属性,而无需涉及真正的手工劳动,但它的开销要大得多,所以如果您经常这样做,我建议您不要这样做。 StringPropertyName

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);
}

但是,您最好的选择是创建具有这些关系的类,这些关系内置到对象的属性中。修改属性的getandset以同时设置受影响的属性和boundItems属性。看起来像这样:

class A: INotifyPropertyChanged
{
   string PhoneNumber;
   string _name;
   B BoundItem = null;
   Public string Name {
     get { return _name;}
     set 
     { 
         _name = value; 
         if(BoundItem != null)
              BoundItem.Name = value;
     }
}

class B
{
   string Name;
   int age;
}

class Main
{
     public Main()
     {
         A item = new A();
         B boundItem = new B();
         item.BoundItem = boundItem;
         item.Name = "TEST";
         Console.WriteLine("Item Name: " + item.Name);
         Console.WriteLine("BoundItem Name: " + boundItem.Name);

         // Result:
         // Item Name: TEST
         // BoundItem Name: TEST
     }
}
于 2012-11-08T17:46:06.027 回答
0

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

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"
        }
    }
}
于 2020-05-17T11:07:28.987 回答