wpf - TextBlock 样式触发器

标签 wpf xaml mvvm styles datatrigger

我想组合来自两个不同 ViewModel 的 DisplayName,但前提是第一个不等于 NullObject。

可以在转换器或父 View 模型中轻松做到这一点,但是我

这根本不显示任何内容:

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

为什么?

最佳答案

我会将其拆分为两个 TextBlock,并且仅使用触发器更改可见性。通过使用 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>

关于wpf - TextBlock 样式触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197474/

相关文章:

c# - WPF MVVM : how to Update UI controllers based on Event

xamarin - Xamarin MVVM传递对象属性

c# - 自动展开 RadGridView 新增行的 RowDetails

c# - 如何处理硬件按钮。在 UWP 中按下后退?

wpf - XAML:如何将 DependencyProperty 绑定(bind)到不同对象上同名的 C# 属性?

c# - 如何在我的场景中使用 MVVM 动态更新数据网格

c# - DesignInstance 在 VS2013 中不起作用

wpf - 将格式设置为 DataGrid -WPF 中显示的数据

c# - WPF MVVM 本地化 C#、运行时

wpf - 将相同类型的 View 模型列表绑定(bind)到 Caliburn.Micro 中的选项卡控件