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

C# 如何绑定到用户控件的属性?,c#,xaml,windows-8,windows-store-apps,winrt-xaml,C#,Xaml,Windows 8,Windows Store Apps,Winrt Xaml,在Windows应用商店应用程序中,您可以创建一个用户控件来封装和重用代码隐藏和布局XAML。简单的用户控件可能如下所示: <UserControl> <StackPanel> <TextBlock Text="First Name" /> <TextBox x:Name="MyTextBox" /> </StackPanel> </UserControl> public s

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

<UserControl>
    <StackPanel>
        <TextBlock Text="First Name" />
        <TextBox x:Name="MyTextBox" />
    </StackPanel>
</UserControl>
public string TextBoxText
{
    get { return MyTextBoxText.Text; }
    set { MyTextBoxText.Text = value; }
}

然而,这是行不通的。似乎将数据绑定到用户控件是XAML UI的重要组成部分。但是它是如何实现的呢?

用户控件中只有一个属性的实现支持消费页面中的绑定。这是一个依赖属性。实现非常简单,但您还必须包含更改的事件,以便直接与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值设置为离开静态线程


祝你好运

您总是谈论绑定,但实际上并没有将textbox.textproperty绑定到您的属性(由您设置)

如果要使用绑定,请创建依赖项属性并通过以下方式绑定textbox的text属性:

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

因此,您的方法不起作用的原因是
用户控件
的父控件未绑定到
用户控件
TextBoxText
属性,而是绑定到
用户控件
TextBoxText
依赖属性。不过,
user控件
TextBox绑定到
TextBoxText
属性。这是不匹配的。因此,即使在
TextBoxText
属性中实现了
INotifyPropertyChanged
TextBoxText
依赖项属性也不会引发事件,因此示例中的绑定不会在UI中更新。你应该测试一下。多尴尬啊。。。谢谢你的提示。我只测试了一种方法!谢谢唯一的实际绑定是由用户控件的父控件绑定到用户控件的属性。比如
。你会如何将一个像点击这样的事件与ICommand关联?像这样公共静态只读DependencyProperty LogoutCommandProperty=DependencyProperty.Register(“LogoutCommand”、typeof(ICommand)、typeof(MyUserControl)、null);私有无效路径logout_(对象发送方,Windows.UI.Xaml.Input.tappedroutedventargs e){LogoutCommand?.Execute(null)`
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;
}