消除重复的 DataTrigger 逻辑

Eliminate duplicate DataTrigger logic

我有一个状态栏,它通过数据绑定和触发器显示用户是否连接到服务器。我设计了两个不同的元素来实现这一点:设置彩色背景(红色、绿色、黄色)的实际 StatusBarItem,以及内部显示文本的 TextBlock("Not Connected"、"Connected" 等)当我在 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)。但它并没有解决整个问题(必须在两个地方更新重复代码)。

在这种特殊情况下,您可以使用 StatusBarItem 样式中的 DataTriggers 设置内容 属性,而不是使用明确的 TextBlock 作为内容:

<StatusBarItem Grid.Column="0" HorizontalAlignment="Left" Padding="10,0,10,0">
    <StatusBarItem.Style>
        <Style TargetType="StatusBarItem">
            <Setter Property="Background" Value="Red" />
            <Setter Property="Content" Value="Not Connected" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.NotConnected}">
                    <Setter Property="Background" Value="Red" />
                    <Setter Property="Content" Value="Not Connected" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.Connected}">
                    <Setter Property="Background" Value="Green" />
                    <Setter Property="Content" Value="Connected to Perforce" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.OfflineMode}">
                    <Setter Property="Background" Value="Goldenrod" />
                    <Setter Property="Content" Value="Offline mode" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StatusBarItem.Style>
</StatusBarItem>

另一种选择是为 StatusBarItem 定义您自己的自定义 ControlTemplate,并使用 ControlTemplate.Triggers 在一个地方更改背景和文本。