2009-05-18 11 views
7

オブジェクトのネストされたプロパティの値を取得したい(Person.FullName.FirstNameのようなもの)。私は.NETでそれがバインディングで同様の目的のために使用するPropertyPathという名前のクラスがあることを知っていました。 WPFのメカニズムを再利用する方法はありますか、それとも私自身で書くべきですか?PropertyPathクラスを使用してオブジェクトのプロパティ値を取得する方法はありますか?

答えて

12

PropertyPathを再利用することは、ネストされたプロパティを指し示して指し示すようにトラバースすることをサポートするので魅力的です。あなたは自分でも同じような機能を書くことができますが、私は過去に自分自身を持っていますが、半複雑なテキスト解析と多くの反射作業が必要です。

Andrewは、単にWPFからPropertyPathを再利用できることを指摘しています。私はちょうどそのコードが少し関与している場合にあなたが持っているオブジェクトに対してそのパスを評価したいと思っています。 PropertyPathを評価するには、DependencyObjectに対するBindingで使用する必要があります。これを実証するために、ただ1つのDependencyPropertyを持つBindingEvaluatorという単純なDependencyObjectを作成しました。真のマジックは、BindingOperations.SetBindingを呼び出してバインディングを適用し、評価された値を読み取ることによって行われます。

var path = new PropertyPath("FullName.FirstName"); 

var binding = new Binding(); 
binding.Source = new Person { FullName = new FullName { FirstName = "David"}}; // Just an example object similar to your question 
binding.Path = path; 
binding.Mode = BindingMode.TwoWay; 

var evaluator = new BindingEvaluator(); 
BindingOperations.SetBinding(evaluator, BindingEvaluator.TargetProperty, binding); 
var value = evaluator.Target; 
// value will now be set to "David" 


public class BindingEvaluator : DependencyObject 
{ 
    public static readonly DependencyProperty TargetProperty = 
     DependencyProperty.Register(
      "Target", 
      typeof (object), 
      typeof (BindingEvaluator)); 

    public object Target 
    { 
     get { return GetValue(TargetProperty); } 
     set { SetValue(TargetProperty, value); } 
    } 
} 

これを拡張したい場合は、変更された値の読み取りをサポートするためにPropertyChangedイベントを配線することができます。私はこれが助けて欲しい!

+1

どのようにそのプロパティに書き戻しますか? –

+0

対象を更新するコードサンプルを更新しました。 BindingがTwoWayであることを確認し、セッターを提供するだけです。 –

0

再利用できない理由はありません。

PropertyPathを見る

は は別のプロパティ以下の経路として、又は所有 タイプの下にプロパティを記述するためのデータ構造を実装します。プロパティパスは、オブジェクトにバインドする のデータ、およびアニメーション用のストーリーボード とタイムラインで使用されます。

関連する問題