2009-07-28 9 views
3

私はかなり新しいWPFですが、私が望むようにデータバインディングを取得するにはいくつかの問題があります。私はTextBoxを含むユーザーコントロールを作成しました。そのTextBoxのプロパティは、自分自身のUserControlのプロパティにバインドしたいので、別のものに再度バインドします。WPFのユーザーコントロールでデータバインディングを達成するには?

私には何が欠けていますか?

XAML

<!-- User Control --> 
<TextBox Text="{Binding Path=TheText}" /> 

<!-- Window --> 
<WpfApplication1:SomeControl TheText="{Binding Path=MyStringProp}" /> 

C#

// User Control ---- 

public partial class SomeControl : UserControl 
{ 
    public DependencyProperty TheTextProperty = DependencyProperty 
     .Register("TheText", typeof (string), typeof (SomeControl)); 

    public string TheText 
    { 
     get 
     { 
      return (string)GetValue(TheTextProperty); 
     } 
     set 
     { 
      SetValue(TheTextProperty, value); 
     } 
    } 

    public SomeControl() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
} 

// Window ---- 

public partial class Window1 : Window 
{ 
    private readonly MyClass _myClass; 

    public Window1() 
    { 
     InitializeComponent(); 

     _myClass = new MyClass(); 
     _myClass.MyStringProp = "Hallo Welt"; 

     DataContext = _myClass; 
    } 
} 

public class MyClass// : DependencyObject 
{ 
// public static DependencyProperty MyStringPropProperty = DependencyProperty 
//  .Register("MyStringProp", typeof (string), typeof (MyClass)); 

    public string MyStringProp { get; set; } 
// { 
//  get { return (string)GetValue(MyStringPropProperty); } 
//  set { SetValue(MyStringPropProperty, value); } 
// } 
} 

よろしく
オリバーハナッピ

PS:私は私のユーザーコントロール上のINotifyPropertyChangedインターフェイスを実装しようとしましたが、それは助けになりませんでした。

答えて

2

TextBoxのTextプロパティを、それが住んでいるUserControlのTheTextプロパティにバインドしたいのですか?だから、財産がどこに住んでいるかを伝える必要があります。そこにこれを行うにはいくつかの方法があります(あなたがFindAncestorを使用してRelativeSourceでそれを行うことができます)が、最も簡単な方法は、XAMLでユーザーコントロールに「名前」を与えると結合要素を使用してバインドすることです:

<UserControl ... 
    x:Name="me" /> 
    <TextBox Text="{Binding TheText,ElementName=me}" /> 
</UserControl> 

今あなたは、 TextBoxはあなたが割り当てた(またはバインドされた)値を "SomeControl.TheText"プロパティに反映します。他のコードを変更する必要はありませんが、INotifyPropertyChangedを基礎となるMyClassオブジェクトに実装して、バインディングはプロパティが変更されたときを認識します。

+0

私はUserControlのDataContextを 'this'に設定しています。したがって、Bindingはどのプロパティが意味されているかを知っています。テキストボックスの値もUserControlのプロパティに正しくバインドされていますが、データバインディングがWindowsで失われているようです。 –

+0

ああそうです - 私は人々がそれを試みるのを見ました。私はそれがウィンドウレベルでバインディングを混乱させるものだと思う。 Element Bindingでそれを行うと、その必要がなくなります。 –

+0

さて、私は今それを解決しました。問題は私のウィンドウでTwoWayにバインドモードを設定する必要があるということでした。ご協力ありがとうございました! –

1

Mattさんから問題が解決されました。今後、この問題を止めるためのヒントと少し説明します。 SomeControl.DataContextとして

SomeControlコンストラクタで設定されている、あなたが意図したとおりに、ウィンドウの結合TheText="{Binding Path=MyStringProp}"はタイプSomeControl、ないMyClassSourceを持っています。

実行時に失敗するバインディングは、Visual Studioの出力パネルにデバッグメッセージを記録します。この場合、 'SomeControl'型のオブジェクトにこのようなプロパティ 'MyStringProp'が存在しないことがわかりました。これはあなたの疑惑を引き起こしたはずです。

誰もがWPFデータバインディングが、特にデバッグするのに時間がかかりますが、辛抱強かったと思います。 WPFのデータバインディングは本当に素晴らしいことですが、UIのデータがどれほど簡単に最新のものになっているかを知ることができます。

+0

ありがとうございます;) –

関連する問題