从UserControl

时间:2018-03-13 14:13:36

标签: c# wpf

例如,有一个TextBlock

的UserControl
<UserControl x:Class="MyControl">
    <TextBlock x:Name="myTextBlock" Text="text"/>
</UserControl> 

然后,我想将TextBlock的Text属性绑定到一个Window TextBox

<Window x:Class="MyWindow">
    <local:MyControl x:Name="myControl"/>
    <TextBox Text="{Binding ...}"/>
</Window>

我该怎么做?
我尝试了{Binding myControl.Text, ElementName=myControl},但没有成功。

1 个答案:

答案 0 :(得分:1)

您的UserControl需要公开属性,以便您可以使用ElementBinding将其绑定到Window中。 最好的方法可能是在UserControl的代码后面的文件中创建一个类型为string的依赖属性“Text”并绑定到它:

public partial class MyControl : UserControl
{
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(MyControl));

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

    public MyControl()
    {
        InitializeComponent();
    }
}

XAML:

<UserControl x:Class="Test.MyControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Name="Root">
    <TextBlock Text="{Binding Text, ElementName=Root}" />
</UserControl>

然后在你的Window中绑定它:

    <StackPanel>
        <test:MyControl Text="Hello" x:Name="myControl" />
        <TextBox Text="{Binding Text, ElementName=myControl, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>

另一种方式: 如果您不希望在控件中创建依赖项属性的开销,可以使用未使用的现有属性,如Tag属性:

    <StackPanel>
        <UserControl Tag="Hello" x:Name="MyControl">
            <TextBlock x:Name="TB" Text="{Binding Tag, ElementName=MyControl}" />
        </UserControl>

        <TextBox Text="{Binding ElementName=MyControl, Path=Tag, UpdateSourceTrigger=PropertyChanged}" />

    </StackPanel>