我有一个状态栏,通过数据绑定和触发器显示用户是否连接到服务器。我正在构建两个不同的元素来实现这个:实际的StatusBarItem设置彩色背景(红色,绿色,黄色),并在里面显示TextBlock以显示文本(“未连接”,“连接”等)正如我'在XAML中执行此操作时,我必须跨两种样式复制DataTrigger逻辑(将背景更新为一种,将文本更新为另一种),如下所示:
<StatusBarItem Grid.Column="0" HorizontalAlignment="Left" Padding="10,0,10,0">
<StatusBarItem.Style>
<Style TargetType="StatusBarItem">
<Setter Property="Background" Value="Red" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.NotConnected}">
<Setter Property="Background" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.Connected}">
<Setter Property="Background" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.OfflineMode}">
<Setter Property="Background" Value="Goldenrod" />
</DataTrigger>
</Style.Triggers>
</Style>
</StatusBarItem.Style>
<TextBlock Width="Auto" Height="Auto">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="Not Connected" />
<Setter Property="Foreground" Value="White" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.NotConnected}">
<Setter Property="Text" Value="Not Connected" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.Connected}">
<Setter Property="Text" Value="Connected to Perforce" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.OfflineMode}">
<Setter Property="Text" Value="Offline Mode" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StatusBarItem>
问题:有没有办法压缩此代码而不重复DataTrigger逻辑?
请注意,我对使TextBlock填写整个StatusBarItem的解决方案不感兴趣。当然,这可以解决这个特殊问题(我只是为两种背景颜色设置TextBlock样式和文字)。但它并没有解决整个问题(必须在两个地方更新的重复代码)。
答案 0 :(得分:1)
在这种特殊情况下,您可以使用StatusBarItem样式中的DataTriggers设置Content属性,而不是使用显式TextBlock作为内容:
settings.py
另一种选择是为StatusBarItem定义自己的自定义ControlTemplate,并使用ControlTemplate.Triggers在一个地方更改背景和文本。