在wpf

时间:2017-09-14 09:28:43

标签: c# wpf xaml datatrigger

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

我在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个这样的标签实例在相同和多个视图中传播。我是否可以在参考资料中定义此触发器一次,并从每个Label中绑定我想要的任何数据。

期待解决方案。

的问候,
Abdyax

2 个答案:

答案 0 :(得分:2)

配置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"带触发器的默认样式

答案 1 :(得分:1)

  

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

简答:不,我不敢。您无法替换Value的{​​{1}},但可以重复使用XAML中的其余样式。

您可以使用XamlReader.Parse方法以编程方式创建样式。然后你可以简单地替换&#34; PersonA&#34;与&#34; PersonB&#34;在您传递给方法的Setter中。

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