【问题标题】:Can I reuse a Style using different DataTrigger Bindings?我可以使用不同的 DataTrigger 绑定重用样式吗?
【发布时间】:2015-08-03 14:02:22
【问题描述】:

我正在开发一个带有许多使用标签的状态指示器的 WPF 4.0 窗口。在一个示例中,如果绑定属性的枚举 Foo 为 AVAILABLE,则标签变为绿色并读取“Available”。如果绑定属性为 NOTAVAILABLE,则标签变为红色并显示“不可用”。我还有其他标签表示不同绑定枚举 Bar 的状态,它们会根据这个值变成不同的颜色并具有不同的内容。

我能够根据绑定属性的值成功绑定和转动一个标签的颜色和文本。我在 DataTrigger 的 Setter 中使用了相当长的 ControlTemplate 来更改标签的文本。

这是我目前所拥有的:

<Window> ...
    xmlns:cst="clr-namespace:CstCommonTypes;assembly=CstCommonTypes"
    ...
</Window>

<Label x:Name="Avail_Out_LBL" HorizontalAlignment="Left" Margin="111,44,0,0" VerticalAlignment="Top" Width="124" Height="18" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" SnapsToDevicePixels="False" Grid.Column="1" Padding="0">
  <Label.Style>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Background" Value="#FFC08100"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Grid Background="{TemplateBinding Background}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="24"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="24"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="Degraded"
                                   Grid.Column="1"
                                   VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                   Padding="{TemplateBinding Padding}"
                                   Background="{TemplateBinding Background}"
                                   Foreground="{TemplateBinding Foreground}"
                                   Width="{TemplateBinding Width}"
                                   Height="{TemplateBinding Height}"
                             />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding MonitorAndControlData.Availability}" Value="{x:Static cst:Foo.Available}">
                <Setter Property="Background" Value="#FF567E4A"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid Background="{TemplateBinding Background}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="24"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="24"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Text="Available"
                                           Grid.Column="1"
                                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                           Padding="{TemplateBinding Padding}"
                                           Background="{TemplateBinding Background}"
                                           Foreground="{TemplateBinding Foreground}"
                                           Width="{TemplateBinding Width}"
                                           Height="{TemplateBinding Height}"
                                    />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding MonitorAndControlData.Availability}" Value="{x:Static cst:Foo.NotAvailable}">
                <Setter Property="Background" Value="LightCoral"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid Background="{TemplateBinding Background}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="22"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="22"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Text=" Not Available"
                                           Grid.Column="1"
                                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                           Padding="{TemplateBinding Padding}"
                                           Background="{TemplateBinding Background}"
                                           Foreground="{TemplateBinding Foreground}"
                                           Width="{TemplateBinding Width}"
                                           Height="{TemplateBinding Height}"
                                    />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Label.Style>

上述方法有效,但我想知道是否可以重用 Style 并为其提供不同的 DataTrigger 绑定,或者只是重用 ControlTemplate 以减少 xaml 代码。我试图看看是否可以定义一个资源,但我不知道如何为所有标签赋予不同的模板绑定。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    如果绑定不同,则无法重用样式。

    您可以做的是让自己成为状态指示器标签的用户控件,在其中您将创建一个依赖属性(我们将其命名为可用性),您将在该属性上绑定您的触发器。但是,您必须确保您的触发器始终需要相同的类型。如果每个标签的可用性绑定类型不同,则此解决方案将不起作用。

    这是一个关于如何使用依赖属性的链接:

    http://www.wpftutorial.net/dependencyproperties.html

    【讨论】:

      【解决方案2】:

      如果您需要绑定更多属性,则将其转换为custom control(即继承自Control 的类),然后您可以在所述控件上添加其他依赖属性,然后您可以绑定到模板。

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 2015-06-29
        • 2013-10-19
        • 2013-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2017-08-09
        • 1970-01-01
        相关资源
        最近更新 更多