2012-06-25 3 views
4

Je voudrais combiner les DisplayNames de deux ViewModels différents, mais uniquement si le premier n'est pas égal à un NullObject.Déclencheurs de style TextBlock

I pourrait facilement le faire dans un convertisseur ou un parent voir le modèle, mais j'espère que ma tentative d'utiliser DataTrigger a une solution facile.

Cheers, Berryl

Cela affiche rien:

 <TextBlock Grid.Column="2" Grid.Row="0" > 
      <TextBlock.Inlines> 
       <Run Text="{Binding HonorificVm.DisplayName}"/> 
       <Run Text="{Binding PersonNameVm.DisplayName}"/> 
      </TextBlock.Inlines> 
      <TextBlock.Style> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding HonorificVm.Honorific}" Value="{x:Static model:Honorific.NullHonorific}"> 
          <Setter Property="Text" Value="PersonNameVm.DisplayName"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
+0

BTW, si cela ne montre rien du tout il y a probablement quelque chose qui cloche avec votre DataContext et/ou les liaisons. –

Répondre

7

Je le diviser en deux TextBlocks et de modifier la visibilité à l'aide d'un déclencheur. En utilisant le Inlines et en essayant de changer le Text dans les déclencheurs vous rencontrerez probablement des problèmes precedence et le Inlines ne peut pas être extrait à Setter.

par exemple.

<StackPanel Grid.Column="2" Grid.Row="0" Orientation="Horizontal"> 
    <TextBlock Text="{Binding HonorificVm.DisplayName}" Margin="0,0,5,0"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding HonorificVm.Honorific}" 
         Value="{x:Static model:Honorific.NullHonorific}"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
    </TextBlock> 
    <TextBlock Text="{Binding PersonNameVm.DisplayName}" /> 
</StackPanel> 

Une alternative serait un MultiBinding au lieu de Inlines:

<TextBlock Grid.Column="2" Grid.Row="0"> 
    <TextBlock.Style> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Text"> 
     <Setter.Value> 
      <MultiBinding StringFormat="{}{0} {1}"> 
      <Binding Path="HonorificVm.DisplayName" /> 
      <Binding Path="PersonNameVm.DisplayName" /> 
      </MultiBinding> 
     </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding HonorificVm.Honorific}" 
        Value="{x:Static model:Honorific.NullHonorific}"> 
      <Setter Property="Text" Value="{Binding PersonNameVm.DisplayName}" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

J'utilise les inlines pour obtenir la course; ce ne serait pas un problème avec deux blocs de texte? Pouvez-vous gratter du code? – Berryl

+0

@Berryl: Je ne comprends pas ce que vous voulez dire; ajouté un exemple. –

+0

Doux, oui, c'est logique, merci! – Berryl

Questions connexes