我试图清理DataContexts与UserControls一起使用的方式,目前我遇到了一个问题,我需要将TabItem中的UserControl数据绑定到父Window的DataContext。 / p>
这是我的窗口的草图:
如您所见,此Window拥有一个TabControl,其中包含通过" Tabs"动态添加的TabItems。的ItemSource。此时的数据绑定正在起作用,因为" Tabs"用Tab 1填充。
选项卡1包含需要访问DiagnosticsViewModel中多个字符串属性的UserControl,但是当我运行我的应用程序时,“输出”窗口指示所有绑定都已失败。例如:
System.Windows.Data错误:4:找不到绑定源 参考' RelativeSource FindAncestor, AncestorType =' System.Windows.Window',AncestorLevel =' 1''。 BindingExpression:路径= Property1;的DataItem = NULL;目标元素是 ' Tab1UserControl' (名称='&#39);目标财产是' UCName' (类型 '字符串&#39)
选项卡1中UserControl的XAML如下所示:
<Grid>
<uc:Tab1UserControl UCName="{Binding Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Grid>
其中UCName是String DependencyProperty。
如果我告诉WPF我想要查找树并绑定到最近的Window的DataContext,并且我的Window的DataContext设置为DiagnosticsViewModel,为什么它不能用于我的UserControl的DataContext?我没有在我的UserControl中设置DataContext = this
,因为我过去做过多次不正确,期望我的UserControl能够从其父级继承DataContext。
我想看看Snoop是否可以解决我的问题,但是这个GUI正在从MFC应用程序中显示,而且Snoop似乎无法附加到我的WPF对话框。
答案 0 :(得分:2)
如果使用RelativeSource,ElementName等更改绑定源,则绑定将直接指向您指定的元素 - 而不是其数据上下文。这意味着在您的代码中,用户控件将尝试绑定到Diagnostics类本身上名为Property1的属性。
尝试使用
<Grid>
<uc:Tab1UserControl UCName="{Binding Path=DataContext.Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Grid>
在您的用户控件的代码中,看看是否能解决问题。
(顺便说一句,用户控制自己知道它所属的窗口将有一个带有给定属性的datacontext的想法对我来说似乎是一个代码味道,特别是因为用户控制点是他们是可重用 - 在用户控件上有一个依赖属性然后在使用它时将它绑定到相应的属性会感觉更好。但这可能只是因为我缺乏上下文。)