Как связать с родительским DataTemplate из ItemsControl.ItemTemplate - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть элемент управления типа контейнера, который содержит несколько элементов.Контейнерный элемент управления имеет 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>

Как связать что-либо на уровне предмета обратно до уровня контейнера?

Ответы [ 3 ]

6 голосов
/ 18 ноября 2011

Вы можете использовать RelativeSource переплет

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

То, что вы используете для своего связующего пути, зависит от того, где находится коллекция. Если он расположен как DependencyProperty на MyContainerControl, то вышеуказанная привязка работает нормально. Если он находится в DataContext из MyContainerControl, то вам нужно установить путь привязки на DataContext.SomeCollection

1 голос
/ 18 ноября 2011

Я всегда был большим поклонником ElementName. По сути, вы убедитесь, что вы называете внешний контроль уровня следующим образом: x:Name="MainWin", а затем вы можете сделать что-то вроде этого:

<DataTemplate>
        <StackPanel Orientation="Horizontal">
                <ComboBox ItemsSource="{Binding ElementName=MainWin, Path=DataContext.SomeCollection}"/>
1 голос
/ 18 ноября 2011

Может быть, использовать TemplateBinding?

Что-то вроде:

{TemplateBinding YourPropertyInTheDataTemplateContext}
...