WPF绑定:如何引用用户控件之外的元素?

时间:2014-08-05 17:23:57

标签: wpf xaml

我的主窗口有以下部分的XAML

<StackPanel>
 <TextBox x:Name="textbox1" />
 <my:UserControl1 />
</StackPanel>

my:UserControl1就像这样

<TextBox x:Name="userControlTextBox" />

我想将上面文本框的Text属性绑定到外部文本框的Text属性。 我试过了

<TextBox x:Name="userControlTextBox" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=textbox1.Text}" />

1 个答案:

答案 0 :(得分:1)

您不能像问题中显示的那样绑定。有两种方法可以实现这一目标:

首先 ,将textBox1的Text绑定到ViewModel中的某个属性。并将userControlTextBox的Text绑定到相同的绑定属性。

<TextBox x:Name="textbox1" Text="{Binding SomeProperty}"/>

并在UserControl中

<TextBox x:Name="userControlTextBox" Text="{Binding SomeProperty}"/>

确保您的属性通知(INPC应通过包含类实现),以便其中的任何更改都传播到GUI。


第二个 将在您的userControl类型字符串上创建自定义DP。使用textbox1的Text值绑定该DP。并将userControlTextBox的Text绑定到该DP。

<StackPanel>
  <TextBox x:Name="textbox1" />
  <my:UserControl1 TextValue="{Binding Text, ElementName=textBox1}"/>
</StackPanel>

此处, TextValue 是您在userControl中声明的自定义DP。

public string CustomValue
{
    get { return (string)GetValue(CustomValueProperty); }
    set { SetValue(CustomValueProperty, value); }
}

public static readonly DependencyProperty CustomValueProperty =
    DependencyProperty.Register("CustomValue", typeof(string),
                                 typeof(UserControl1));

现在,在UserControl中绑定textBox,如下所示:

<TextBox x:Name="userControlTextBox"
         Text="{Binding TextValue, RelativeSource={RelativeSource FindAncestor,
                                         AncestorType=UserControl}}"/>