消除重复的DataTrigger逻辑

时间:2017-01-15 18:23:31

标签: wpf xaml datatrigger

我有一个状态栏,通过数据绑定和触发器显示用户是否连接到服务器。我正在构建两个不同的元素来实现这个:实际的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样式和文字)。但它并没有解决整个问题(必须在两个地方更新的重复代码)。

1 个答案:

答案 0 :(得分:1)

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

settings.py

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