【问题标题】:Why databinding doesn't work on UserControl? [duplicate]为什么数据绑定在 UserControl 上不起作用? [复制]
【发布时间】:2019-10-11 03:27:56
【问题描述】:

我正在尝试在 WPF/C# 中制作一个简单的用户控件。除了数据绑定到 datacontext 中的属性之外,一切似乎都正常工作。

我尝试制作极其简化的示例,以更好地了解我做错了什么。一般来说,我对 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 中。

【问题讨论】:

  • 你需要实现INotifyPropertyChanged,看这里docs.microsoft.com/en-us/dotnet/framework/wpf/data/…
  • 我试过了,没区别。如果我理解正确,依赖属性会负责通知更改吗?不过我不确定。
  • 测试这是否是问题的一种方法是将InitializeComponent();放在构造函数的末尾 - 这样BoundableText将在TextBlock被渲染之前设置
  • 您需要在 UserControl 的根元素上设置名称,然后设置该元素的 dataContext,而不是整个 UserControl!然后你就会有 Binding。
  • @XAMlMAX 无关紧要,因为在构造函数中有 DataContext = this;

标签: c# wpf data-binding


【解决方案1】:

不要在构造函数中将UserControlDataContext设置为自身:

DataContext = this;

那么它就不会从父窗口继承DataContext了。

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

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

【讨论】:

  • 感谢您的帮助!似乎在测试用例中工作,但我在实际用例中仍然存在一些问题。不过我想我会解决的。如果我做不到,我会发布更具体的问题......
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2020-06-02
  • 2021-09-23
  • 2014-05-31
相关资源
最近更新 更多