【问题标题】:PropertyChangedEventHandler How to get value?PropertyChangedEventHandler 如何获取值?
【发布时间】:2012-11-08 17:42:11
【问题描述】:

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

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

【问题讨论】:

    标签: c# inotifypropertychanged


    【解决方案1】:

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

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

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

    不过,您最好的选择是创建具有这些关系的类,这些关系内置到对象的属性中。修改属性的getset 以同时设置受影响的属性和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
         }
    }
    

    【讨论】:

    • 那么您只需在 switch 案例中说“bounditem.Name = (sender as B).Name”。或者,您可以使用反射来完成此操作,但效率要低得多,但更灵活。
    • 编辑了我的答案,为您提供了一个粗略的示例,说明如何使用反射方法作为替代方法。不过,您也可以将自定义方法直接构建到类本身中。因此,不要依赖于 PropertyChange 事件,而是覆盖类属性来设置这两个值。
    【解决方案2】:

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

    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"
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2011-04-05
      • 1970-01-01
      • 2012-02-15
      • 2011-04-13
      • 1970-01-01
      相关资源
      最近更新 更多