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();
}