2017-09-14 3 views
0

J'ai fait quelques recherches sur ce sujet, mais je n'ai pas réussi à savoir comment réutiliser le déclencheur de style.Reusing style trigger dans wpf

J'ai le déclencheur de style défini sur Label et j'utilise Data trigger pour définir le contenu. J'ai plusieurs étiquettes dans la même vue et également dans une vue différente. Les données liées sont du même type sauf sa propriété différente du même contexte de données.

Pensez à suivre 2 étiquettes différentes où j'ai besoin d'afficher les performances de 2 personnes - PersonA et PersonB. La valeur affichée pour les deux étiquettes sera basée sur le format de performance sélectionné.

<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> 

Si vous voyez, la seule différence est le premier déclencheur prend PERSONA et le second déclencheur prend PersonB. J'ai 10 occurrences d'une telle étiquette réparties dans des vues identiques et multiples. Est-il possible que je puisse définir ce déclencheur une fois dans les ressources et lier toutes les données que je veux à partir de chaque étiquette.

Dans l'attente de la solution.

Cordialement,
Abdyax

Répondre

2

setters configurent pour obtenir des valeurs non de l'étiquette DataContext, mais une autre propriété 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> 

et lier des étiquettes Tag à des propriétés différentes:

<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}"/> 

les deux étiquettes devrait choisir notre style par défaut TargetType="Label" avec déclencheurs

+1

Probablement préférable d'utiliser un style explicite plutôt qu'implicite, car il peut y avoir beaucoup d'étiquettes sans rapport là-bas, et vous ne voulez pas remplacer leur contenu. Sinon, une solution parfaitement cromante. –

+0

Fonctionne comme le charme. Merci! – Abdyax

1

Est-il est possible que je peux définir ce déclencheur une fois en ressources et lier toutes les données que je veux de chaque étiquette.

Réponse courte: Non, je ne crains pas. Vous ne pouvez pas remplacer le Value d'un Setter mais réutiliser le reste du style dans XAML.

Vous pouvez créer les styles par programmation à l'aide de la méthode XamlReader.Parse. Ensuite, vous pouvez simplement remplacer le "PersonA" par "PersonB" dans le string que vous passez à la méthode.

Mais il n'y a aucun moyen de le faire généralement en pur XAML.

+1

C'est certainement possible. Tous les éléments de base nécessaires sont là: (1) l'évaluation des chemins de propriété est dynamique; (2) le 'DataContext' d'étiquettes individuelles peut être surchargé; et (3) les liaisons sur chaque 'DataTrigger' pourraient être faites pour se lier par rapport à la' DataContext' de la vue plutôt qu'à celle de l'étiquette. Alternativement, on pourrait utiliser la propriété 'Tag' comme emplacement de stockage pour l'instance' Person', comme décrit par @ASh. Cela peut être fait, raisonnablement, et il y a plus d'une façon de le faire. –

+0

"Vous ne pouvez pas remplacer la valeur d'un Setter mais réutiliser le reste du style dans XAML". Ce n'est pas possible. La liaison à la propriété Tag est en effet possible dans ce cas particulier. Mais cela ne fonctionne que si la propriété Value est exactement la même. – mm8

+0

Une mise en garde importante, mais une question théorique dans ce cas, OP indiquant que les types de données sont les mêmes, et les liaisons ne diffèrent que par leur racine de liaison relative. –