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

送信者オブジェクトを使用して、必要に応じて適切な型にキャストすることもできます。これにより、柔軟性が少し向上します。を使用すると、 の値をReflection使用するだけで実際の手作業を伴わずにプロパティを取得および設定できますが、オーバーヘッドがはるかに大きくなるため、これを頻繁に行う場合は使用しないことをお勧めします。 StringPropertyName

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

または、スイッチ ケースを作成する代わりに、Reflection を使用してプロパティを設定することもできます。

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します。それは次のようになります。

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 に答える