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