2012-02-29 16 views
1

私はDependencyObjectを間違って使用している可能性があります。テキストボックスの2つのレイヤーバインディングが書き込まれていない

プロパティFirstNameとLastNameを持つPersonというDependencyObjectを実装する汎用クラスがあります。

次に、私のViewModelクラスにdatacontextを設定したxamlコントロールがあります。 ViewModelクラスの中に私はPersonを取得/設定するUserNameというプロパティがあります。テキストボックスはUserName.FirstNameプロパティにバインドされています。テキストボックスに正しくデータを入力できますが、文字を入力してタブアウトするとセットを呼び出すことができません。私は問題が2つのレベルのプロパティバインディングだと思う。設計上の理由から、2つのレベルのプロパティを使用してアクセスする必要があります。助言がありますか?ここで

は私のXAMLである:ここでは

<TextBox Width="100" Margin="10,0,0,0" Text="{Binding Path=UserName.FirstName, Mode=TwoWay}" /> 

は、ビューモデルクラスの私の財産です:

public Person UserName 
    { 
     get 
     { 
      return person; 
     } 
     set 
     { 
      person = value; 
     } 
    } 

私もこの方法もそれを試してみた:

public Person UserName 
    { 
     get 
     { 
      return person; 
     } 
     set 
     { 
      person.FirstName = value.FirstName; 
     } 
    } 
+1

は単に 'User'は、 – sll

+0

があなたのコードでテストを行なったし、それは私の最初の時間のために働いて少し混乱しています。..プロパティへのコールバックを追加したので、値が変更されているのが見えました。 – NestorArturo

+0

本当ですか?プロパティにコールバックを追加するとどういう意味ですか? – dave

答えて

1

をあなたのプロパティはバインディングから呼び出されません。プロパティはパターンのためにしか存在しませんので、コードから簡単に見えます。 バインディングは依存関係プロパティを直接設定します。

なぜこのような状況で依存関係プロパティが必要ですか?依存関係のプロパティはコントロールに関係します - あなたのシナリオでは、通常のプロパティとINotifyPropertyChangedを使用するため、コードは簡単になります:)

DependencyPropertyが変更されたときに通知したい場合、静的イベントハンドラをDependencyPropertyに追加する必要があります。登録(...)コール。

+0

+1のために 'INotifyPropertyChanged'を参照してください –

+0

私は参照してください。私は間違った道を下ってきた。 INotifyPropertyChangedが私に役立つかどうかはわかりません。私は、UserNameプロパティ内のセットにブレークポイントを配置しており、プログラムはブレークしません。私は出力ウィンドウを見て、私は何かエラーを表示しません。この状況でどのようにINotifyPropertyChangedを使用するかのサンプルスニペットを教えてください。私はINotifyPropertyChangedを使用しました。私がusercontrolにデータを変更したことを伝える必要があるときだけです。ありがとう。 – dave

1

ルーンアンダーセンと同意する。 INotifyPropertyChangedを使用する必要があります。あなたはUserName` `としてPerson``型のプロパティと呼ばれていない理由は、offtopicのため申し訳ありません

public class Person :INotifyPropertyChanged 
    { 

     private string _firstName; 
     public string FirstName 
     { 
      get { return _firstName; } 
      set { _firstName = value; OnPropertyChanged("FirstName"); } 
     } 
     private string _lastName; 
     public string LastName 
     { 
      get { return _lastName; } 
      set { _lastName = value; OnPropertyChanged("LastName"); } 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 
関連する問題