我试图在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中。
答案 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