2017-09-14 79 views
0

我已经对此进行了一些研究,但未能找出如何重用样式触发器。在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

回答

2

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"带触发器

+1

可能最好使用明确的样式而不是隐式的,因为可能有很多不相关的标签,并且你不想覆盖它们的内容。否则,一个完美的解决方案。 –

+0

工程像魅力。谢谢! – Abdyax

1

是有办法,我可以定义在资源这个触发一次,并结合我想从每个标签到任何数据。

简答:不,恐怕不是。您无法替换SetterValue,但可以在XAML中重新使用样式的其余部分。

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

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

+1

这当然是可以的。所有必要的构建块都在那里:(1)对财产路径的评估是动态的; (2)可以覆盖单个标签的'DataContext'; (3)可以使每个DataTrigger上的绑定相对于视图的DataContext而不是标签绑定。或者,可以使用'Tag'属性作为'Person'实例的存储位置,如@ASh所描述的那样。它可以合理地完成,并且有多种方法可以完成。 –

+0

“您无法替换Setter的值,但可以在XAML中重新使用样式的其余部分”。这不可能。尽管如此,绑定到Tag属性在这种特殊情况下确实是可能的。但它仍然只有在Value属性完全相同时才有效。 – mm8

+0

一个重要的警告,但在这种情况下没有什么意义,因为OP表明数据类型是相同的,并且绑定只在它们的相对绑定根上有所不同。 –