Wpf 自定义控件';s内容可以';t绑定到控件的父级

Wpf 自定义控件';s内容可以';t绑定到控件的父级,wpf,xaml,data-binding,itemtemplate,Wpf,Xaml,Data Binding,Itemtemplate,我有以下XAML(简化,无结束标记): 地图: 但是,组合框的绑定将失败 找不到与绑定的源 参考'ElementName=myWindow' 有关自定义控件的一些事实: tb:ToolBar是UserControl,它包含实际的ToolBar,其中ItemsSource绑定到tb:ToolBar(类型继承IList)的项属性 工具栏的工具栏项目数据模板是从多个数据模板中选择的(根据项目的类型) 属于tb:ToolBarControl的数据模板非常简单-它只包含绑定到tb:ToolBarCo

我有以下XAML(简化,无结束标记):


地图:
但是,
组合框
的绑定将失败

找不到与绑定的源 参考'ElementName=myWindow'

有关自定义控件的一些事实:

  • tb:ToolBar
    UserControl
    ,它包含实际的
    ToolBar
    ,其中
    ItemsSource
    绑定到
    tb:ToolBar
    (类型继承
    IList
    )的
    项属性

  • 工具栏
    工具栏项目
    数据模板
    是从多个
    数据模板
    中选择的(根据项目的类型)

  • 属于
    tb:ToolBarControl
    的数据模板非常简单-它只包含绑定到
    tb:ToolBarControl
    的属性
    ContentPresenter

  • tb:ToolBarControl
    不是出于技术原因
    UserControl
    ,它只是
    DependencyObject
    ,具有
    对象类型的属性
    内容

为什么
组合框不能引用
窗口


谢谢你的帮助

我在这里遇到了类似的问题:


DependencyObject没有DataContext,我认为这就是绑定不起作用的原因。尝试从FrameworkElement继承,而不是从“DependencyObject”继承。

我明白了,但我不能只是将基类型更改为UIElement,因为对于ItemsControl容器类型的已有项,
ItemTemplate和ItemTemplateSelector被忽略;键入='ToolBarControl'
。看起来我必须重写数据模板以控制模板:(我根据你的建议改进了我的代码,但它仍然不起作用。我发布了第二个问题:你确定失败来自组合框吗?说的是window不是myWindow,但在错误消息中说'ElementName=myWindow'@Xim这是因为我更改了原始名称。绑定错误指定了它的来源。原始完整错误是“System.Windows.Data错误:4:找不到引用为'ElementName=view2D'的绑定源。BindingExpression:Path=Generator.Maps;DataItem=null;目标元素为'ComboBox'(名称=“”);目标属性为'ItemsSource'(类型'IEnumerable')。是的,“view2D”是窗口的名称。”。
<Window Name="myWindow" DataContext="{Binding ElementName=myWindow}" >
    <DockPanel>
        <tb:ToolBar Name="toolbar" DockPanel.Dock="Top">
            <tb:ToolBar.Items>
                <tb:ToolBarControl Priority="-3">
                    <tb:ToolBarControl.Content>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock>Maps:</TextBlock>
                            <ComboBox ItemsSource="{Binding Generator.Maps, ElementName=myWindow}">