2012-06-25 2 views
4

Я хотел бы объединить DisplayNames из двух разных ViewModels, но только если первый не равен NullObject.Триггеры стиля TextBlock

Приветствия, Berryl

Это не отображает вообще ничего:

 <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, если это не показывает вообще ничего есть, вероятно, что-то неладно с DataContext и/или креплениями. –

ответ

7

Я бы разделил его на две TextBlocks и только изменить видимость с помощью триггера. Используя Inlines и попытавшись изменить Text в триггерах, вы, вероятно, столкнетесь с проблемами precedence, и Inlines не может быть извлечен до Setter.

например.

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

Альтернативой будет MultiBinding вместо 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

Я использую встроенные строки, чтобы получить Run; Разве это не проблема с двумя текстовыми блоками? Вы можете поцарапать какой-то код? – Berryl

+0

@ Berryl: Я не совсем понимаю, что вы имеете в виду; добавлен пример. –

+0

Сладкий, да, имеет смысл, thx! – Berryl