如何绑定到用户控件的属性?

时间:2013-05-15 19:52:33

标签: c# xaml windows-8 windows-store-apps winrt-xaml

在Windows应用商店应用中,您可以创建用户控件来封装和重用代码隐藏和布局XAML。简单的用户控件可能如下所示:

<UserControl>
    <StackPanel>
        <TextBlock Text="First Name" />
        <TextBox x:Name="MyTextBox" />
    </StackPanel>
</UserControl>

现在,我想设置绑定。因此,我创建了代码隐藏,其属性公开了UI控件的Text属性。像这样:

public string TextBoxText
{
    get { return MyTextBoxText.Text; }
    set { MyTextBoxText.Text = value; }
}

然而,这不起作用。似乎绑定到用户控件的数据是XAML UI的重要组成部分。但它是如何完成的?

2 个答案:

答案 0 :(得分:10)

在用户控件中只有一个属性实现支持在使用页面中进行绑定。这是一个依赖属性。实现很简单,但您还必须包含已更改的事件以直接与UI交互,因为依赖项属性是控件上的静态属性。像这样:

public string TextBoxText
{
    get { return (string)GetValue(TextBoxTextProperty); }
    set { SetValue(TextBoxTextProperty, value); }
}

public static readonly DependencyProperty TextBoxTextProperty =
    DependencyProperty.Register("TextBoxText", typeof(string), typeof(MyUserControl),
    new PropertyMetadata(string.Empty, OnTextBoxTextPropertyChanged));

private static void OnTextBoxTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    (d as MyUserControl).MyTextBox.Text = e.NewValue.ToString();
}

我承认,这不是很明显。但希望现在您知道,这将节省您数小时的搜索并试图找出答案。同样,您只能绑定到用户控件的依赖项属性。而且,您只能使用更改的事件从静态线程设置UI值。

祝你好运!

答案 1 :(得分:0)

你总是谈论绑定 - 但你实际上并没有将textbox.textproperty绑定到你的属性(你设置它)。

如果您想使用绑定,请创建依赖项属性并以这种方式绑定文本框的text-property:

<TextBox x:Name="MyTextBox" **Text="{Binding TextBoxText, Mode=TwoWay}"** />

不要忘记将usercontrols DataContext属性设置为usercontrol-instance:

public MyUserControl1()
{
  this.InitializeComponent();

  // Set the datacontext to the usercontrol-instance.
  // If you don't, the binding will use the usercontrol's parent-datacontext.
  this.DataContext = this;
}