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

4

我有几个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>    

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

2个回答

3
您的绑定有误。
在您的中,绑定应该是这样的:
<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="False">
   <Setter Property="StackPanel.Visibility" Value="Collapsed" />
</DataTrigger>

这里的RelativeSource使用Self模式告诉绑定引擎要绑定的对象是应用了该样式的对象(例如,你的StackPanel)。PropertyPath中的Tag.IsChecked告诉绑定引擎在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中使用时,往往难以理解)。
希望这可以帮到您!

1

使用转换器:设置 StackPanel 的可见性:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接