Привязка к свойству cutom родительского шаблона - PullRequest
1 голос
/ 02 августа 2011

В: Как связать пользовательское свойство родительского шаблона из стиля дочернего элемента управления DataTrigger

Я несколько дней ломал голову над этим.

У меня есть TreeView с привязкой к данным, который использует стиль с шаблоном.TreeView привязывается к ObservableCollection и HierarchicalDataTemplate + DataTemplate связываются со свойствами внутри элемента коллекции.

FontGroup -> Font (s)

<Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}">
...
<Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Image x:Name="ExpanderImage" Source="/Typesee;component/Resources/tree_expand.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="??? IsItemSelected ???" Value="True">
                            <Setter TargetName="ExpanderImage" Property="Source" Value="/Typesee;component/Resources/tree_collapse_selected.png" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ControlTemplate x:Key="FontTreeViewTemplate" TargetType="{x:Type TreeViewItem}">
...
    <ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" ... />
...
    <ControlTemplate.Triggers>
            <DataTrigger Binding="{Binding IsItemSelected}" Value="True">
            <!-- WORKS FINE HERE -->
            </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Сначала я попытался связать как:

Binding Path=IsItemSelected, RelativeSource={RelativeSource TemplatedParent}

Затем я прочитал, что это может не сработать, поэтому я попытался (включая AncestorLevel 1 + 3):

Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2

Также пробовал сочетания с UpdateSourceTrigger = PropertyChanged и Mode = TwoWay

Если это некорректный дизайн, пожалуйста, предложите способ сделать это: я в основном хочу изменить изображение кнопки расширения в зависимости от того, истинно ли свойство IsItemSelected для TreeViewItem - есть идеи?

Большое спасибо за любую помощь!

1 Ответ

5 голосов
/ 02 августа 2011

По всей вероятности, видовой моделью будет DataContext, поэтому привязка должна быть привязкой RelativeSource с соответствующим путем, который должен быть нацелен на DataContext, поскольку новый источник - RelativeSource:

 {Binding DataContext.IsItemSelected,
          RelativeSource={RelativeSource AncestorType=TreeViewItem}}

Как отмечалось в моем комментарии, было бы целесообразно извлечь эту логику из шаблона ControlTemplate, поскольку это выходит за его пределы.Одним из методов будет создание подкласса ToggleButton и предоставление открытого свойства для изображения, которое затем можно изменить с помощью Style.

...