【发布时间】: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