首页 > 解决方案 > 为什么数据绑定在 UserControl 上不起作用?

问题描述

我正在尝试在 WPF/C# 中创建一个简单的用户控件。除了数据绑定到数据上下文中的属性之外,一切似乎都有效。

我尝试制作极其简化的示例,以更好地了解我做错了什么。一般来说,我对 WPF 很陌生,所以我认为我在某种程度上做错了依赖属性。可能在绑定本身中,但对于其他元素(如 TextBox)正常工作。这似乎是类似的问题,但在我的情况下答案似乎不起作用:Why DataBinding is not propagating to UserControl

MainWindow.xaml(省略根标记)

    <StackPanel>
        <local:UserControl1 TextToDisplay="{Binding BoundableText}" />
        <TextBlock Text="{Binding BoundableText}" />
    </StackPanel>

UserControl1.xaml(省略根标记)

    <TextBlock Text="{Binding TextToDisplay}" />

MainWindow.xaml.cs:

using System.Windows;
using System.Windows.Controls;

namespace UserControlTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            BoundableText = "This text is bound";
        }

        public string BoundableText { get; set; }
    }

    public partial class UserControl1 : UserControl
    {
        public static readonly DependencyProperty TextToDisplayProperty = 
            DependencyProperty.Register(nameof(TextToDisplay), typeof(string), typeof(UserControl1), new PropertyMetadata("Default text"));
        public string TextToDisplay
        {
            get => (string)GetValue(TextToDisplayProperty);
            set => SetValue(TextToDisplayProperty, value);
        }

        public UserControl1()
        {
            InitializeComponent();
            DataContext = this;
        }
    }
}

这两个元素的内容也应该相同,显示在代码隐藏中设置的文本(“此文本已绑定”)。TextBox 可以正常工作,但 UserControl1 只有默认文本。这个案例与第一个案例有何不同?我可以让它同样工作吗?注意:我还尝试绑定到其他元素的属性,效果很好。也可以从代码隐藏中绑定。但是,这应该可以从 xaml 本身实现。在实际用例中,控件将位于 DataTemplate 中。

标签: c#wpfdata-binding

解决方案


不要在构造函数中将 of 设置DataContextUserControl自身:

DataContext = this;

然后它不会DataContext从父窗口继承。

要绑定到 中的TextToDisplay依赖属性UserControl,您可以使用RelativeSource

<TextBlock Text="{Binding TextToDisplay, RelativeSource={RelativeSource AncestorType=UserControl}}" />

推荐阅读