【问题标题】:How to bind to parent DataTemplate from within an ItemsControl.ItemTemplate如何从 ItemsControl.ItemTemplate 中绑定到父 DataTemplate
【发布时间】:2012-01-01 08:49:25
【问题描述】:

我有一个包含许多项目的容器类型控件。容器控件定义了一个DataTemplate,其中还包含一个ItemsControl 和一个DataTemplate 用于项目。但是,这些项目需要绑定到容器控件中的某些内容。下面给出一个简化的例子:

<DataTemplate DataType="{x:Type ContainerType}">

    <!-- Display of the container stuff-->

    <ItemsControl ItemsSource="{Binding Items, Mode=OneWay}">

        <ItemsControl.ItemTemplate>
              <DataTemplate DataType="{x:Type Item}">

                  <!-- Display of the item stuff -->
                  <ComboBox Text="Choose a container-level option..."
                            ItemsSource="{WHAT GOES HERE?}"/>

                </DataTemplate>
         </ItemsControl.ItemTemplate>

      </ItemsControl>
</DataTemplate>

如何将项目级别的内容绑定到容器级别?

【问题讨论】:

    标签: wpf data-binding datatemplate


    【解决方案1】:

    您可以使用RelativeSource 绑定

    <ComboBox ItemsSource="{Binding SomeCollection, 
                  RelativeSource={RelativeSource 
                      AncestorType={x:Type local:MyContainerControl}}}"/>
    

    您用于绑定路径的内容取决于集合所在的位置。如果它位于MyContainerControl 上的DependencyProperty,则上述绑定工作正常。如果它位于MyContainerControlDataContext 中,则需要将绑定路径设置为DataContext.SomeCollection

    【讨论】:

    • 集合是 ContainerType DataTemplate 的 DataContext 中的一个属性,所以我尝试了ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ContainerType}}, Path=DataContext.AvailableJobs}。也尝试了上面的表格,但都没有奏效......
    • @BrianTriplett 从绑定中删除 FindAncestor,
    • 很抱歉,但仍然没有在 ComboBox 中显示集合。当您说MyContainerControl 时,您指的是我在示例代码中所称的ContainerType,还是指包含ContainerType 的DataTemplate 的控件(在本例中为ContentControl)?
    • @BrianTriplett 包含 ContainerType 的 DataTemplate 的控件
    【解决方案2】:

    也许使用 TemplateBinding?

    类似:

    {TemplateBinding YourPropertyInTheDataTemplateContext}
    

    【讨论】:

    • TemplateBinding 仅适用于 ControlTemplates,据我所知。
    【解决方案3】:

    我一直是ElementName 的忠实粉丝。基本上,您确保将外部级别控件命名为:x:Name="MainWin",然后您可以执行以下操作:

    <DataTemplate>
            <StackPanel Orientation="Horizontal">
                    <ComboBox ItemsSource="{Binding ElementName=MainWin, Path=DataContext.SomeCollection}"/>
    

    【讨论】:

    • 这行不通。 DataTemplate 在可视化树中没有明确的名称,因此可以通过ElementName 引用它
    • 我以前也这么认为,但我向你保证,我已经在 WPF 项目中工作了。刚刚测试过了。您在使用 Silverlight 吗?这是我实际工作代码的剪辑/过去:
    • `
    • @BrianTriplett 我重新阅读了您的回复。您是正确的,DataTemplate 没有在元素树中获得名称,但 DataTemplate 中的绑定可以通过模板外部可视树中的名称引用元素。不是相反,因为 DataTemplate 不是一个实际的元素,而是一个工厂。
    • 另外,只是我额外的 0.02 美元。 RelativeResource 看起来更干净,而 ElementName 可能更像是一种快速破解,但它很快并且确实有效。
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2011-11-27
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多