2011-02-07 9 views
2

"もっと"ボタンの横にあるテキストボックス(textBox1と呼ばれる)を含むTextBoxAndMoreというユーザーコントロールを作成しました。このユーザーコントロールには、Textというプロパティがあります。このTextプロパティは、テキストボックス内のテキストを反映するようにしたいと思います。私のユーザーコントロールのバインディングが機能していません

私のXAMLで、私はこのように、私のViewModelに説明呼ばれるStringプロパティにバインドすることができるように私は、バインド可能であることを、このプロパティを希望:

<my:TextBoxAndMore Text="{Binding Path=Description}" /> 

だから私は(次のコードを持っていますpropdbスニペットによって生成された):

// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(String), typeof(TextBoxAndMore), 
     new UIPropertyMetadata(String.Empty)); 

    public String Text 
    { 
     get { return (String)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

そして、テキストボックスに、私はTextChangedイベントハンドラに取り付けたこのコードを持っている、という考えは、その時にテキストボックスにユーザーが、このユーザーのTextプロパティであることコントロールはそれに応じて変更されます:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     Text = textBox1.Text; 
    } 

ただし結局のところ、バインディングは機能していないようです。出力ウィンドウにエラーはなく、ViewModelのDescriptionプロパティも設定されません(nullのままです)。

私はそれが明らかだと確信していますが、私はWPFにはかなり新しく、いくつかのガイダンスに感謝します。

+1

、変更したいですバインディングは 'TwoWay'になり、ユーザによってなされた更新は自動的にプロパティに戻る。 – Gabe

+0

ありがとうございます、XAMLを ''に変更しましたが、私はまだ同じ問題を抱えているようです。 – Matt

答えて

2

私はあなたが2ウェイバインディングを構成する必要があると思う:

<my:TextBoxAndMore Text="{Binding Path=Description Mode=TwoWay}" /> 

ます。また、コントロールのTextChangedイベントコードを削除しても、コントロールのTextプロパティに結合する双方向を使用することができます。

編集:

< - > ==双方向結合...

TextBlockInControlsTemplate < - > TextDepPropInControl < - 代わりに `TextChanged`ハンドラの> DescriptionPropInVM

+0

+1:Nice、OneWayバインディングがデフォルトモードです:o) –

+0

ありがとうございます。私はXAMLをこれに変更しましたが、TextChangedイベントコードを持っているかどうかに関わらず、ViewModelのDescriptionプロパティはnullのままです。 – Matt

+0

まあ、このタイプのセットアップでは、VMの記述はnullにならないはずです(私は思う??)。空の文字列または何らかのデフォルト値に設定する必要があります。最終的にはこれが唯一の実際の文字列であり、その他はすべてポインタです(少なくとも論理的には)。 – Aardvark

関連する問題