【问题标题】:How do you bind to the property of a User Control?如何绑定到用户控件的属性?
【发布时间】:2013-05-15 19:52:33
【问题描述】:

在 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 的一个有价值的部分。但它是如何实现的呢?

【问题讨论】:

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


    【解决方案1】:

    用户控件中只有一种属性实现支持消费页面中的绑定。那是一个依赖属性。实现很简单,但您还必须包含更改的事件才能直接与 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();
    }
    

    我承认,这不是很明显。但希望现在您知道了,它会节省您数小时的搜索和试图弄清楚的时间。同样,您只能绑定到用户控件的依赖属性。而且,您只能使用 changed 事件设置静态线程的 UI 值。

    祝你好运!

    【讨论】:

    • 唯一实际的绑定是由用户控件的父级绑定到用户控件的属性。喜欢&lt;UI:MyControl TextBoxText="{Binding Somepath}" /&gt;
    • 您如何将 Tapped 之类的事件与 ICommand 关联起来?像这样? ` public static readonly DependencyProperty LogoutCommandProperty = DependencyProperty.Register("LogoutCommand", typeof(ICommand), typeof(MyUserControl), null);私有 void PathLogout_Tapped(对象发送者,Windows.UI.Xaml.Input.TappedRoutedEventArgs e){ LogoutCommand?.Execute(null);`
    【解决方案2】:

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

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

    <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;
    }
    

    【讨论】:

    • 所以,你的方法不起作用的原因是user control 的父级没有绑定到user controlTextBoxText 属性,它是绑定到user controlTextBoxText 依赖属性。不过,user control TextBox 绑定到 TextBoxText 属性。这是一个不匹配。因此,即使您在 TextBoxText property 中实现了 INotifyPropertyChangedTextBoxText dependency property 也不会引发事件,因此在您的绑定中示例,不会在 UI 中更新。你应该测试一下。
    • 多么尴尬……谢谢你的提示。我只测试了一种方法!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2019-04-17
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多