Шаблон триггера XAML для установки видимости на основе другого элемента - PullRequest
3 голосов
/ 24 октября 2011

У меня есть несколько StackPanels, которые меняют видимость в зависимости от ToggleButtons.Код ниже работает, если я заменю Tag на btn1 на DataTrigger -линии.Как использовать значение свойства Tag?

<Window x:Class="MyTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestApp">

    <Window.Resources>
        <Style x:Key="panelStyle" TargetType="{x:Type StackPanel}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=Tag, Path=IsChecked}" Value="False">
                    <Setter Property="StackPanel.Visibility" Value="Collapsed" />
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=Tag, Path=IsChecked}" Value="True">
                    <Setter Property="StackPanel.Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

    </Window.Resources>

    <WrapPanel>
        <ToggleButton Content="One" Name="btn1" />
        <ToggleButton Content="Two" Name="btn2" />

        <StackPanel Style="{StaticResource panelStyle}" Tag="{Binding btn1}">
            <Label Content="Data to panel 1" />
        </StackPanel>

        <StackPanel Style="{StaticResource panelStyle}" Tag="{Binding btn2}">
            <Label Content="Data to panel 2" />
        </StackPanel>

    </WrapPanel>

</Window>    

Этот вопрос очень похож, но мне не хватает деталей о том, как передать имя элемента.
XAML -Общий стиль текстового поля с триггерами / параметрами?

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Ваши привязки неверны.

В вашем DataTemplate привязки должны быть:

<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="False">
   <Setter Property="StackPanel.Visibility" Value="Collapsed" />
</DataTrigger>

Здесь RelativeSource с режимом Self сообщает механизму привязки, что объект, к которому привязывается объект, является объектом длякакой стиль применяется (например, ваш StackPanel).PropertyPath из Tag.IsChecked говорит механизму привязки искать свойство с именем IsChecked из объекта, хранящегося в Tag.

Наконец, привязки в вашем StackPanel должны быть:

<StackPanel Style="{StaticResource panelStyle}" Tag="{Binding ElementName=btn1}">
   <Label Content="Data to panel 1" />
</StackPanel>

Здесь ElementName создает привязку к другому элементу в логическом дереве.Если вы явно не назначаете никакие свойства в Binding, как в исходном примере:

Tag="{Binding btn1}"

Указанное значение присваивается свойству Path.Так что это будет то же самое, что и:

Tag="{Binding Path=btn1}"

Также обратите внимание, что использование Tag не считается наилучшей практикой, поскольку его тип имеет значение object и его использование не ограничено, и, следовательно, может принимать любыеколичество различных значений в вашем проекте (что часто затрудняет понимание, особенно при использовании в Templates, которые расположены далеко от их фактического использования).

Надеюсь, это поможет!

1 голос
/ 24 октября 2011

Использовать конвертер: установить видимость StackPanel:

<StackPanel Visivility="{Binding IsChecked, ElementName=btn1, Converter={StaticResource BooleanToVisibilityConverter}}">
  ...
</StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...