基于另一个元素设置可见性的XAML触发器模板



我有几个stackpanel根据ToggleButtons改变可见性。如果我用DataTrigger -行上的btn1替换Tag,下面的代码可以工作。我如何使用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>    

这个问题非常相似,但是我缺少关于如何传递元素名称的细节。
通用文本框样式与触发器/参数?

您的绑定不正确。

在你的DataTemplate中绑定应该是:

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

这里的RelativeSource模式为Self,它告诉绑定引擎要绑定的对象是应用了样式的对象(例如你的StackPanel)。Tag.IsCheckedPropertyPath告诉绑定引擎从存储在Tag中的对象中查找一个名为IsChecked的属性。

最后,你的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中使用时,离实际用途很远)。

希望这对你有帮助!

使用Converter:设置StackPanel的可见性:

<StackPanel Visivility="{Binding IsChecked, ElementName=btn1, Converter={StaticResource BooleanToVisibilityConverter}}">
  ...
</StackPanel>

最新更新