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

4
在Windows Store应用程序中,您可以创建一个用户控件来封装和重复使用代码和布局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个回答

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值。

祝你好运!


唯一实际的绑定是由用户控件的父级绑定到用户控件的属性。例如 <UI:MyControl TextBoxText="{Binding Somepath}" /> - Jerry Nixon
1
你如何将像Tapped这样的事件与ICommand关联起来?就像这样吗?public static readonly DependencyProperty LogoutCommandProperty = DependencyProperty.Register("LogoutCommand", typeof(ICommand), typeof(MyUserControl), null); private void PathLogout_Tapped( object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) { LogoutCommand?.Execute(null); - O.O

0

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

如果你想使用绑定,创建一个依赖属性,并以这种方式绑定textbox的文本属性:

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

不要忘记将用户控件的DataContext属性设置为用户控件实例:
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;
}

所以,你的方法不起作用的原因是因为用户控件的父级没有绑定到用户控件TextBoxText属性,而是绑定到了用户控件TextBoxText依赖属性。虽然用户控件的文本框绑定到了TextBoxText属性,但这是不匹配的。因此,即使你在TextBoxText属性中实现了INotifyPropertyChangedTextBoxText依赖属性也不会引发事件,因此在你的示例中绑定不会在UI中更新。你应该进行测试。 - Jerry Nixon
好尴尬啊...谢谢你的提示。我只测试了一种方式!感谢! - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接