0

ElementName="TB2"とPath="Text"を使用して別のTextBox(TB2)にバインドされたText値を持つTextBox(TB1)があります。

次に、TB1の後ろのコードにSetBindingしている3番目のTextBox(TB3)があります。これにより、TB3を編集でき、TB1とTB2の両方で、バインディングが(理論的には)すべて同じであるために変更が反映されます。 。

TB1を編集でき、TB2が更新されます(またはその逆)が、TB3が値を表示/更新することはありません。

TB1バインディングがDependencyPropertyではなくElementNameを使用しているためだと思いますか?

ElementNameを使用してバインドされた要素のバインドをコピーすることは可能ですか?

<TextBox Name="TB1">
    <Binding ElementName="TB2" Path="Text" UpdateSourceTrigger="PropertyChanged"/>
</TextBox>
<TextBox Name="TB2">
    <Binding Path="Name" UpdateSourceTrigger="PropertyChanged"/>
</TextBox>

次に、背後にあるコードで私は持っています:

BindingExpression bindExpression = TB1.GetBindingExpression(TextBox.TextProperty);
if (bindExpression != null && bindExpression.ParentBinding != null && bindExpression.ParentBinding.Path != null)
{
    TB3.DataContext = TB1.DataContext;
    TB3.SetBinding(TextBox.TextProperty, bindExpression.ParentBinding);
}

通常、テストで見つかったのは、同じxaml内でこれが機能することです。ただし、以下のように独自のウィンドウにTB3があり、テキストボックスが正しくバインドされることはありません。何が欠けていますか?

if (bindExpression != null && bindExpression.ParentBinding != null && bindExpression.ParentBinding.Path != null)
{
    PopupWindow wnd = new PopupWindow();
    wnd.DataContext = TB1.DataContext;
    wnd.TB3.SetBinding(TextBox.TextProperty, bindExpression.ParentBinding);
    wnd.Show();
}

理由は100%わかりませんが、これでうまくいきました。SetBindingと同じバインディングを実行しているようですが、ソースがDataItemに設定されていますが、必要な結果が得られました...ありがとうKlaus78。

if (bindExpression != null && bindExpression.ParentBinding != null && bindExpression.ParentBinding.Path != null)
    {
        PopupWindow wnd = new PopupWindow();
        Binding b = new Binding();
        b.Source = bindExpression.DataItem; //TB1;
        b.Path = new PropertyPath("Text");
        b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        wnd.TB3.SetBinding(TextBox.TextProperty, b);
        wnd.Show();
    }
4

1 に答える 1

1

バインドする新しいウィンドウTB3.TextTB2.Text

TB3.Text の実際には、バインディング オブジェクト whereElement=TB2とがありPath=Textます。問題は、新しいウィンドウのビジュアル ツリーに名前TB2の要素がないため、Visual Studio の出力デバッグを見るとバインド エラーが発生することです。

TB1.DataContextnullであることにも注意してください。一方、バインディング クラスには既にElementバインディング ソースであるプロパティ セットがあるため、このコマンドは役に立ちません。

バインディングを TB1 から TB3 に単純にコピーすることはできないと思います。とにかく、TB3 のような新しい Binding オブジェクトを作成する必要があります

Window2 wnd = new Window2();
Binding b = new Binding();
b.Source = TB1;
b.Path = new PropertyPath("Text");
wnd.TB3.SetBinding(TextBox.TextProperty, b);
wnd.Show();

そのようなコードは役に立ちますか?

于 2012-10-22T14:18:46.103 に答える