中重用样式触发器

中重用样式触发器

本文介绍了在 wpf 中重用样式触发器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对此进行了一些研究,但未能找到如何重用样式触发器.

I have done some research on this but failed to find out on how to reuse the style trigger.

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

I have style trigger set on Label and I am using Data trigger to set content. I have multiple labels in same view and also in different view. The Data bound is of same type except its different property of same data context.

考虑以下 2 个不同的标签,我需要在其中显示 2 个人的表现 - PersonA 和 PersonB.为两个标签显示的值将基于所选的性能格式.

Consider following 2 different labels where I need to display performance of 2 person - PersonA and PersonB. The value displayed for both the labels will be based on Performance format selected.

<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 个此类标签的实例分布在相同和多个视图中.有没有办法可以在资源中定义一次这个触发器,并从每个标签绑定我想要的任何数据.

If you see, the only difference is the first trigger takes PersonA and the second trigger takes PersonB. I have 10 instances of such label spread in same and multiple views. Is there is way I can define this trigger once in Resources and bind whatever data I want to from each Label.

期待解决方案.

问候,
阿布迪亚克斯

Regards,
Abdyax

推荐答案

配置 setter 以获取不是来自 Label DataContext 的值,而是另一个 Label 属性 - Tag

configurate setters to obtain values not from Label DataContext, but another Label property - Tag

<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>

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

and bind labels Tag to different properties:

<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" 选择我们的默认样式

both labels should pick our default style for TargetType="Label" with triggers

这篇关于在 wpf 中重用样式触发器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-30 06:26