代码之家  ›  专栏  ›  技术社区  ›  Ilan Keshet

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

  •  0
  • Ilan Keshet  · 技术社区  · 4 年前

    我正在尝试基于DataTrigger更改内容控件的内容,但运气不佳,DataTrigger会检查绑定是否与类型匹配,以及是否确实更改了 contentcontrols 显示的内容。

    简而言之,如果源是某种类型,我希望此ContentControl的内容能够更改。我已尝试使用样式/Datariggers进行此操作

    <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, 0"/>
                    <TextBlock Text="{Binding IdEntry.Entry.Name}" ToolTip="{Binding IdEntry.Entry.Name}" FontSize="13" Margin="5, 0, 0, 0"/>
                  </StackPanel>
                </Setter.Value>
              </Setter>
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </ContentControl.Style>
    </ContentControl>
    

    我已经测试了转换器: IsAssociation 正确地被击中,并且是正确的值,但内容不会改变为 stackpanel 如所定义 DataTrigger 。我已经使用Visual Studios的Visual Tree确认了这一点,它仍然链接到旧内容。

    0 回复  |  直到 4 年前
        1
  •  3
  •   Clemens    4 年前

    A直接设置 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>