在wpf中重用样式触发器
我已经对此进行了一些研究,但未能找出如何重用样式触发器。在wpf中重用样式触发器
我在标签上设置了样式触发器,我使用数据触发器来设置内容。我在同一视图中也有不同视图的多个标签。数据绑定是相同的类型,除了它具有相同数据上下文的不同属性。
考虑以下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>
如果你看到的,唯一的区别是第一个触发需要的人物和第二触发需要PersonB。我有10个这样的标签传播在相同和多个视图。是否有办法在资源中定义此触发器,并将每个标签所需的任何数据进行绑定。
期待解决方案。
问候,
Abdyax
configurate setters来获得标签的DataContext值不大,但另一个标签属性 - 标签
<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
的Value
,但可以在XAML中重新使用样式的其余部分。
您可以使用XamlReader.Parse方法以编程方式创建样式。然后,您可以简单地将您传递给方法的string
中的“PersonA”替换为“PersonB”。
但是在纯粹的XAML中通常没有办法做到这一点。
这当然是可以的。所有必要的构建块都在那里:(1)对财产路径的评估是动态的; (2)可以覆盖单个标签的'DataContext'; (3)可以使每个DataTrigger上的绑定相对于视图的DataContext而不是标签绑定。或者,可以使用'Tag'属性作为'Person'实例的存储位置,如@ASh所描述的那样。它可以合理地完成,并且有多种方法可以完成。 –
“您无法替换Setter的值,但可以在XAML中重新使用样式的其余部分”。这不可能。尽管如此,绑定到Tag属性在这种特殊情况下确实是可能的。但它仍然只有在Value属性完全相同时才有效。 – mm8
一个重要的警告,但在这种情况下没有什么意义,因为OP表明数据类型是相同的,并且绑定只在它们的相对绑定根上有所不同。 –
可能最好使用明确的样式而不是隐式的,因为可能有很多不相关的标签,并且你不想覆盖它们的内容。否则,一个完美的解决方案。 –
工程像魅力。谢谢! – Abdyax