为什么数据绑定在UserControl上不起作用?

时间:2019-05-24 13:55:42

标签: c# wpf data-binding

我试图在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;
        }
    }
}

这2个元素的内容也应该相同,显示在代码后面设置的文本(“此文本是绑定的”)。 TextBox可以正常工作,但是UserControl1仅具有默认文本。是什么使这种情况与第一种情况不同?我可以使它正常工作吗? 注意:我也尝试绑定到其他元素的属性,效果很好。还可以从代码隐藏作品中进行绑定。但是,这可以从xaml本身实现。在实际使用情况下,控件将位于DataTemplate中。

1 个答案:

答案 0 :(得分:2)

不要在构造函数中将const people = { mary: { children: [ john: new ChildClass(), paul: new ChildClass(), george: new ChildClass() ] }, homer: { children: [ bart: new ChildClass(), lisa: new ChildClass(), maggie: new ChildClass() ] } }; const all_children = []; /* pseudocode: foreach people(children) { foreach children(child) { all_children.push(child); } } */ all_children.forEach(child => { /* does something with mary and homer's children */ }); ////////////////// delete people.mary; all_children.forEach(child => { /* STILL does something with mary and homer's children, even though mary has been deleted */ }); 的{​​{1}}设置为其自身:

DataContext

那么它将不会从父窗口继承UserControl

要绑定到DataContext = this; 中的DataContext依赖项属性,可以使用TextToDisplay

UserControl