aXu*_*_AP 1 c# data-binding wpf
我正在尝试在 WPF/C# 中制作一个简单的用户控件。除了数据上下文中属性的数据绑定之外,一切似乎都有效。
我尝试制作极其简化的示例,以更好地了解我做错了什么。一般来说,我对 WPF 还很陌生,所以我认为我在某种程度上做错了依赖属性。可能在绑定本身中,但这通常适用于其他元素,例如 TextBox。这似乎是类似的问题,但答案似乎在我的情况下不起作用:Why DataBinding is not propagating to UserControl
MainWindow.xaml(省略根标签)
<StackPanel>
<local:UserControl1 TextToDisplay="{Binding BoundableText}" />
<TextBlock Text="{Binding BoundableText}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
UserControl1.xaml(根标记省略)
<TextBlock Text="{Binding TextToDisplay}" />
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml.cs:
<StackPanel>
<local:UserControl1 TextToDisplay="{Binding BoundableText}" />
<TextBlock Text="{Binding BoundableText}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这两个元素的内容也应该相同,显示在代码隐藏中设置的文本(“此文本已绑定”)。TextBox 按其应有的方式工作,但 UserControl1 只有默认文本。这个案例与第一个案例有何不同?我可以让它以同样的方式工作吗?注意:我还尝试绑定到其他元素的属性,效果很好。还可以从代码隐藏进行绑定。但是,这应该可以从 xaml 本身实现。在实际用例中,控件将位于 DataTemplate 中。
不要在构造函数中将 的 设置为自身DataContext:UserControl
DataContext = this;
Run Code Online (Sandbox Code Playgroud)
那么它就不会DataContext从父窗口继承。
要绑定到TextToDisplay中的依赖属性UserControl,您可以使用RelativeSource:
<TextBlock Text="{Binding TextToDisplay, RelativeSource={RelativeSource AncestorType=UserControl}}" />
Run Code Online (Sandbox Code Playgroud)