代码之家  ›  专栏  ›  技术社区  ›  AbSharp

在wpf中重用样式触发器

  •  1
  • AbSharp  · 技术社区  · 7 年前

    我对此做了一些研究,但没有找到如何重用样式触发器。

    我在标签上设置了样式触发器,我正在使用数据触发器设置内容。我在同一个视图中有多个标签,也在不同的视图中。除了同一数据上下文的不同属性外,数据绑定的类型相同。

    <Label Grid.Row="5" Grid.Column="9"
    HorizontalContentAlignment="Center"
    VerticalContentAlignment="Center">
    <Label.Style>
        <Style BasedOn="{StaticResource SomeGlobalStaticStyle}" TargetType="Label">
            <Style.Triggers>
                <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="Fractional">
                    <Setter Property="Content"  Value="{Binding DataModel.PersonA.Performance.Value.Fractional}"  />
                </DataTrigger>
                <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="Decimal">
                    <Setter Property="Content"  Value="{Binding DataModel.PersonA.Performance.Value.Decimal}" />                    
                </DataTrigger>
                <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="US">
                    <Setter Property="Content"  Value="{DataModel.PersonA.Performance.Value.US}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
    

    <Label Grid.Row="6" Grid.Column="9"
    HorizontalContentAlignment="Center"
    VerticalContentAlignment="Center">
    <Label.Style>
        <Style BasedOn="{StaticResource SomeGlobalStaticStyle}" TargetType="Label">
            <Style.Triggers>
                <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="Fractional">
                    <Setter Property="Content"  Value="{Binding DataModel.PersonB.Performance.Value.Fractional}"  />
                </DataTrigger>
                <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="Decimal">
                    <Setter Property="Content"  Value="{Binding DataModel.PersonB.Performance.Value.Decimal}" />                    
                </DataTrigger>
                <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="US">
                    <Setter Property="Content"  Value="{DataModel.PersonB.Performance.Value.US}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
    

    如果你看到了,唯一的区别是第一个触发器使用PersonA,第二个触发器使用PersonB。我在相同和多个视图中有10个这样的标签分布实例。有没有办法在参考资料中定义这个触发器一次,并从每个标签绑定我想要的任何数据。

    当做
    阿布迪亚克斯

    2 回复  |  直到 7 年前
        1
  •  4
  •   ASh aminescm    7 年前

    配置setter以获取值,而不是来自标签DataContext,而是另一个标签属性-标记

    <Style BasedOn="{StaticResource SomeGlobalStaticStyle}" TargetType="Label">
        <Style.Triggers>
            <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="Fractional">
                <Setter Property="Content"  Value="{Binding Tag.Performance.Value.Fractional, RelativeSource={RelativeSource Self}}}"  />
            </DataTrigger>
            <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="Decimal">
                <Setter Property="Content"  Value="{Binding Tag.Performance.Value.Decimal, RelativeSource={RelativeSource Self}}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding PersonModel.PerformanceFormat}" Value="US">
                <Setter Property="Content"  Value="{Binding Tag.Performance.Value.US, RelativeSource={RelativeSource Self}}}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    并将标签标记绑定到不同的属性:

    <Label Grid.Row="5" Grid.Column="9"
    HorizontalContentAlignment="Center"
    VerticalContentAlignment="Center" Tag="{Binding DataModel.PersonA}"/>
    
    <Label Grid.Row="6" Grid.Column="9"
    HorizontalContentAlignment="Center"
    VerticalContentAlignment="Center" Tag="{Binding DataModel.PersonB}"/>
    

    TargetType="Label" 带触发器

        2
  •  1
  •   mm8    7 年前

    有没有办法在参考资料中定义这个触发器一次,并从每个标签绑定我想要的任何数据。

    Value Setter

    您可以使用 XamlReader.Parse 方法然后,您可以简单地将中的“PersonA”替换为“PersonB” string

    但在纯XAML中通常无法做到这一点。