C#WPF基于DataTrigger更改ContentControl内容不起作用

问题描述

我很幸运地尝试基于DataTrigger更改内容控件的内容,该控件检查绑定以查看其是否与类型匹配,以及是否确实更改了contentcontrols显示内容

简而言之,如果Source是某种类型,我希望此ContentControl的Content更改。我尝试使用Styles / DataTriggers

<ContentControl>
  <ContentControl.Content>
    <TextBlock Name="CollectionControlTextBox1" 
         Tag="." 
         PreviewMouseDown="CollectionControlDefaultDockPanel_MouseButtonDown"
         PreviewMouseUp="CollectionControlTextBox1_PreviewMouseUp"
         MouseMove="CollectionControlDefaultDockPanel_MouseMove"
         Drop="CollectionControlDefaultDockPanel_Drop"
         Foreground="{Binding Meta.ColorBrush,Mode=OneWay,TargetNullValue={StaticResource TextBrush},FallbackValue={StaticResource TextBrush}}"
         AllowDrop="True"
         MinHeight="20" 
         Padding="5 2 0 0"
         KeyboardNavigation.IsTabStop="False"
         Focusable="True"
         TextTrimming="CharacterEllipsis"
         ContextMenu="{Binding ParentControl.MemberContextMenu,Mode=OneWay}"
         Text="{Binding displayName,Mode=OneWay}">
      <TextBlock.CommandBindings>
        <CommandBinding Command="{x:Static iugo:EditorCommands.Metadata}" Executed="Metadata" />
      </TextBlock.CommandBindings>
    </TextBlock>
  </ContentControl.Content>
  <ContentControl.Style>
    <Style targettype="ContentControl">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Source,Converter={StaticResource IsAssociation}}" Value="True">
          <Setter Property="Content">
            <Setter.Value>
              <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding IdEntry.Id}" ToolTip="{Binding IdEntry.Entry.Name}" FontSize="10" Foreground="{StaticResource disabledTextBrush}" HorizontalAlignment="Center" Margin="0,3,0"/>
                <TextBlock Text="{Binding IdEntry.Entry.Name}" ToolTip="{Binding IdEntry.Entry.Name}" FontSize="13" Margin="5,0"/>
              </StackPanel>
            </Setter.Value>
          </Setter>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ContentControl.Style>
</ContentControl>

我已经测试了以下转换器:IsAssociation被正确命中,并且正确地是正确的值,但是内容没有更改为stackpanel中定义的DataTrigger。我已经通过使用Visual Studios的Visual Tree确认了这一点,它仍然链接到旧内容

解决方法

直接设置为Content

<ContentControl>
    <Content>
        ...
    </Content>
</ContentControl>

value precedence高于样式设置器中由设置器设置的值。因此,您的DataTrigger将被忽略。

代替直接设置内容,将初始值移动到另一个设置器:

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Content">
                <Setter.Value>
                    <TextBlock ...>
                        ...
                    </TextBlock>
                </Setter.Value>
             </Setter>
             <Style.Triggers>
                 <DataTrigger ...>
                     <Setter Property="Content">
                         <Setter.Value>
                             <StackPanel Orientation="Horizontal">
                                 ...
                             </StackPanel>
                         </Setter.Value>
                     </Setter>
                 </DataTrigger>
             </Style.Triggers>
         </Style>
    </ContentControl.Style>
</ContentControl>