我有几个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.IsChecked
的PropertyPath
告诉绑定引擎从存储在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>