XAML触发器模板,用于根据其他元素设置可见性

时间:2011-10-24 09:49:13

标签: wpf xaml triggers

我有几个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 - Generic textbox stylewith triggers / parameters?

2 个答案:

答案 0 :(得分:3)

您的绑定不正确。

在你的DataTemplate中,绑定应该是:

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

此处RelativeSource模式为Self告诉绑定引擎要绑定的对象是应用该样式的对象(例如,您的StackPanel)。 PropertyPath的{​​{1}}告诉绑定引擎从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中使用时。)

希望这有帮助!

答案 1 :(得分:1)

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

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