在 wpf 中重用样式触发器

Reusing style trigger in wpf

我对此做了一些研究,但未能找到如何重用样式触发器的方法。

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

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

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

期待解决方案。

此致,
Abdyax

Is there is way I can define this trigger once in Resources and bind whatever data I want to from each Label.

简短回答:不,恐怕不会。您不能替换 SetterValue,但可以重复使用 XAML.

中的其余样式

您可以使用 XamlReader.Parse 方法以编程方式创建样式。然后,您只需将传递给方法的 string 中的 "PersonA" 替换为 "PersonB"。

但是在纯 XAML.

中一般没有办法做到这一点

配置 setter 不是从 Label DataContext 而是从另一个 Label 属性 - 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>

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

<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" with triggers