繁体   English   中英

在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个此类标签实例。 有没有一种方法可以在“资源”中一次定义此触发器并绑定每个标签中想要的任何数据。

期待解决方案。

问候,
Abdyax

配置设置器以获取值,而不是从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>

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

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

有没有一种方法可以在“资源”中一次定义此触发器并绑定每个标签中想要的任何数据。

简短的回答:不,恐怕不是。 你不能代替Value一的Setter ,但重复使用XAML样式的其余部分。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM