【问题标题】:Databinding a TabItem to a parent Window将 TabItem 数据绑定到父窗口
【发布时间】:2017-06-16 00:14:00
【问题描述】:

我正在尝试清理我在 UserControls 中使用 DataContexts 的方式,目前遇到了一个问题,我需要将 TabItem 内的 UserControl 数据绑定到父窗口的 DataContext。

这是我的窗口的草图:

如您所见,此窗口拥有一个 TabControl,其中包含通过“Tabs”ItemSource 动态添加的 TabItems。此时数据绑定正在工作,因为“选项卡”填充了选项卡 1。

选项卡 1 包含一个需要访问 DiagnosticsViewModel 中的多个字符串属性的 UserControl,但是当我运行我的应用程序时,输出窗口指示所有绑定都失败了。例如:

System.Windows.Data 错误:4:找不到绑定源 参考'RelativeSource FindAncestor, AncestorType='System.Windows.Window',AncestorLevel='1''。 绑定表达式:路径=属性 1;数据项=空;目标元素是 'Tab1UserControl'(名称='');目标属性是“UCName”(类型 '字符串')

选项卡 1 中 UserControl 的 XAML 如下所示:

<Grid>
    <uc:Tab1UserControl UCName="{Binding Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Grid>

其中 UCName 是一个字符串 DependencyProperty。

如果我告诉 WPF 我要查找树并绑定到最近窗口的 DataContext,并且我的 Window 的 DataContext 设置为 DiagnosticsViewModel,为什么它不将它用于我的 UserControl 的 DataContext?我没有在我的 UserControl 中设置 DataContext = this,因为我过去多次做错了,期望我的 UserControl 能够从其父级继承 DataContext。

我想看看 Snoop 是否可以解决我的问题,但是这个 GUI 是从 MFC 应用程序中显示的,而且 Snoop 似乎无法附加到我的 WPF 对话框。

【问题讨论】:

    标签: c# wpf xaml data-binding itemssource


    【解决方案1】:

    如果您使用 RelativeSource、ElementName 等更改绑定的来源,则绑定将直接指向您指定的元素,而不是其数据上下文。这意味着在您的代码中,用户控件将尝试绑定到 Diagnostics 类本身名为 Property1 的属性。

    尝试使用

    <Grid>
        <uc:Tab1UserControl UCName="{Binding Path=DataContext.Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
    </Grid>
    

    在您的用户控件的代码中,看看是否能解决问题。

    (顺便说一句,用户控件本身知道它所属的窗口将具有具有给定属性的数据上下文的想法对我来说似乎是一种代码味道,特别是因为用户控件的意义在于它们是可重用 - 在用户控件上有一个依赖属性,然后在使用时将其绑定到适当的属性会感觉更好。不过,这可能只是因为我缺乏上下文。)

    【讨论】:

    • 谢谢,我可以发誓我已经尝试过了,但它不起作用,但我只是再次添加它,它似乎使其中一个属性起作用。我会仔细检查,如果它检查出来,然后将你的标记为答案!
    • 关于您的最后一条评论,我的 UserControl is 中的 UCName 是一个 DependencyProperty,我这样做是为了让 UserControl 的使用者可以设置其初始属性值之一.这听起来像是一种更容易接受的方法吗?
    • 抱歉,我认为绑定在用户控件本身的定义中,而不是由于某种原因被选项卡使用的位置。你这样做的方式是一种完全可以接受的方法,我不知道我是怎么误读的!
    • 很酷,感谢您的澄清,当然还有您的有用回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多