C# 在wpf中重用样式触发器

C# 在wpf中重用样式触发器,c#,wpf,xaml,datatrigger,C#,Wpf,Xaml,Datatrigger,我对此做了一些研究,但没有找到如何重用样式触发器 我在标签上设置了样式触发器,并使用数据触发器设置内容。我在同一视图中有多个标签,在不同视图中也有多个标签。数据绑定的类型相同,但其属性不同,属于同一数据上下文 考虑下面两个不同的标签,其中我需要显示两个人的表现-PersonA和PersonB。两个标签的显示值将基于所选的性能格式 <Label Grid.Row="5" Grid.Column="9" HorizontalContentAlignment="Center" VerticalC

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

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

考虑下面两个不同的标签,其中我需要显示两个人的表现-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>


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

期待解决方案

问候,
阿布迪亚克斯

是否有一种方法可以在参考资料中定义此触发器一次,并从每个标签绑定我想要的任何数据

简短回答:不,恐怕不行。不能替换
Setter
,而是在XAML中重用样式的其余部分

您可以使用该方法以编程方式创建样式。然后,您可以简单地将传递给方法的
字符串中的“PersonA”替换为“PersonB”


但是在纯XAML中通常没有办法做到这一点

是否有一种方法可以在参考资料中定义此触发器一次,并从每个标签绑定我想要的任何数据

简短回答:不,恐怕不行。不能替换
Setter
,而是在XAML中重用样式的其余部分

您可以使用该方法以编程方式创建样式。然后,您可以简单地将传递给方法的
字符串中的“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”
选择默认样式

配置setter以获取值,而不是从标签数据上下文,而是另一个标签属性-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”
选择默认样式

可能最好使用显式样式,而不是隐式样式,因为可能存在大量不相关的标签,并且您不希望覆盖其内容。否则,一个完美的cromulent解决方案,就像魅力一样有效。谢谢可能最好使用显式样式而不是隐式样式,因为可能有大量不相关的标签,并且您不想覆盖它们的内容。否则,一个完美的cromulent解决方案,就像魅力一样有效。谢谢这当然是可能的。所有必要的构件都存在:(1)属性路径的评估是动态的;(2) 可以覆盖单个标签的
DataContext
;(3)每个
DataTrigger
上的绑定可以相对于视图的
DataContext
而不是标签进行绑定。或者,可以使用
标记
属性作为
个人
实例的存储位置,如@ASh所述。这是可以合理完成的,而且有不止一种方法可以做到,“您不能替换Setter的值,而是在XAML中重用样式的其余部分”。这是不可能的。不过,在这种特殊情况下,绑定到Tag属性确实是可能的。但它仍然只有在Value属性完全相同的情况下才起作用。这是一个重要的警告,但在本例中是一个没有实际意义的警告,因为OP指出数据类型是相同的,绑定只是在其相对绑定根中不同。“但在纯XAML中通常无法做到这一点。”当我说“这当然是可能的”时,我指的是OP提出的问题,而不是你关于不能替换setter值的具体断言,这是真的。我承认我可以说得更具体一些,这当然是可能的。所有必要的构件都存在:(1)属性路径的评估是动态的;(2) 可以覆盖单个标签的
DataContext
;(3)每个
DataTrigger
上的绑定可以相对于视图的
DataContext
而不是标签进行绑定。或者,可以使用
标记
属性作为
个人
实例的存储位置,如@ASh所述。这是可以合理完成的,而且有不止一种方法可以做到,“您不能替换Setter的值,而是在XAML中重用样式的其余部分”。这是不可能的。不过,在这种特殊情况下,绑定到Tag属性确实是可能的。但它仍然只有在Value属性完全相同的情况下才起作用。这是一个重要的警告,但在本例中是一个没有实际意义的警告,因为OP指出数据类型是相同的,绑定只是在其相对绑定根中不同。“但在纯XAML中通常无法做到这一点。”当我说“这当然是可能的”时,我指的是OP提出的问题,而不是你关于不能替换setter值的具体断言,这是真的。我承认我