DataTrigger Setter下如何使用由多个TextBlock组成的WrapPanel

问题描述

我有一个由一些列组成的 DataGrid。在一个 DataGridTemplateColumn 中,我想使用一个条件。如果条件为 False,则应显示单个绑定属性。如果条件是True,它应该显示多个绑定属性(这是我无法完成的)。我如何在 WrapPanel DataTrigger 下使用 Setter

我的 XAML 代码

<DataGrid x:Name="DG_SipList"  ItemsSource="{Binding Items3}" Margin="0 8 0 0"  CanUserSortColumns="False"  CanUserAddRows="False"  AutoGenerateColumns="False" VerticalAlignment="Top" HorizontalAlignment="Left"   materialDesign:DataGridAssist.CellPadding="13 8 8 8"  materialDesign:DataGridAssist.ColumnHeaderPadding="8" IsReadOnly="True" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" >
    <DataGrid.Resources>
        <Style targettype="TextBlock" x:Key="cfgText">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Self}}" Value="False">
                    <Setter Property="FontWeight" Value="Bold"/>
                    <Setter Property="FontStyle" Value="Italic"/>
                    <Setter Property="Textdecorations" Value="Underline"/>
                    <Setter Property="Foreground" Value="Red"/>
                    <Setter  Property="HorizontalAlignment"  Value="Left" />
                    <Setter Property="textwrapping" Value="WrapWithOverflow" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style targettype="TextBlock" x:Key="cfgText2">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Self}}" Value="True">
                    <Setter Property="FontWeight" Value="Bold"/>
                    <Setter Property="FontStyle" Value="Italic"/>
                    <Setter Property="Foreground" Value="Red"/>
                    <Setter  Property="HorizontalAlignment"  Value="Left" />
                    <Setter Property="textwrapping" Value="WrapWithOverflow" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>

    <DataGrid.Columns>
        <DataGridTemplateColumn Header="START" IsReadOnly="False">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox x:Name="cb_MontajStart" Checked="cb_MontajStart_Checked" Unchecked="cb_MontajStart_Unchecked" IsChecked="{Binding LISTE_MONTAJ_START}" HorizontalAlignment="Center"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="ID">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=LISTE_KIMLIK}" Tag="{Binding Path=LISTE_MONTAJ_START}" Style="{StaticResource cfgText2}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        
        <DataGridTemplateColumn Header="PRODUCT" MaxWidth="450">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock>
                        <TextBlock.Style>
                            <Style targettype="TextBlock">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding konfTanim}" Value="False">
                                        <Setter Property="Text" Value="{Binding LISTE_URUN}"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding konfTanim}" Value="True">
                                        <Setter>
<!--This is what I can not combine more than one textblock under Datatrigger Setter-->
                                             <WrapPanel Orientation="Horizontal" MaxWidth="450">
                        <TextBlock Text="{Binding Path=yeni_ModelTanim}"/>
                        <TextBlock Text="{Binding Path=MT4}" Tag="{Binding Path=monStd4}" Style="{StaticResource cfgText}"/>
                        <TextBlock Text="{Binding Path=MT5}" Tag="{Binding Path=monStd5}" Style="{StaticResource cfgText}"/>
                        <TextBlock Text="{Binding Path=MT6}" Tag="{Binding Path=monStd6}" Style="{StaticResource cfgText}"/>  
                                            </WrapPanel>   
                                        </Setter>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- ........................................................... -->
        <DataGridTemplateColumn x:Name="txt_Configuration"  Header="configuration" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <WrapPanel Orientation="Horizontal" MaxWidth="450">
                        <TextBlock Text="{Binding Path=yeni_ModelTanim}"/>
                        <TextBlock Text="{Binding Path=MT4}" Tag="{Binding Path=monStd4}" Style="{StaticResource cfgText}"/>
                        <TextBlock Text="{Binding Path=MT5}" Tag="{Binding Path=monStd5}" Style="{StaticResource cfgText}"/>
                        <TextBlock Text="{Binding Path=MT6}" Tag="{Binding Path=monStd6}" Style="{StaticResource cfgText}"/>  
                    </WrapPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
      </DataGrid.Columns>
</DataGrid>

解决方法

如果有多个相同类型的不同表示,根据标志或其他属性,您必须为每个表示实现自定义 DataTemplateSelector 和数据模板,例如:

<DataTemplate x:Key="KonfTanimFalseTemplate">
   <TextBlock Text="{Binding LISTE_URUN}"/>
</DataTemplate>
<DataTemplate x:Key="KonfTanimTrueTemplate">
   <WrapPanel Orientation="Horizontal" MaxWidth="450">
      <TextBlock Text="{Binding Path=yeni_ModelTanim}"/>
      <TextBlock Text="{Binding Path=MT4}" Tag="{Binding Path=monStd4}" Style="{StaticResource cfgText}"/>
      <TextBlock Text="{Binding Path=MT5}" Tag="{Binding Path=monStd5}" Style="{StaticResource cfgText}"/>
      <TextBlock Text="{Binding Path=MT6}" Tag="{Binding Path=monStd6}" Style="{StaticResource cfgText}"/>
   </WrapPanel>  
</DataTemplate>

数据模板选择器检查 konfTanim 属性并返回适当的数据模板。

public class KonfTanimDataTemplateSelector : DataTemplateSelector
{
   public override DataTemplate SelectTemplate(object item,DependencyObject container)
   {
      if (!(container is FrameworkElement frameworkElement) || !(item is YourItemType yourItem))
         return null;

      var dataTemplateName = yourItem.konfTanim ? "KonfTanimTrueTemplate" : "KonfTanimFalseTemplate";
      return (DataTemplate) frameworkElement.FindResource(dataTemplateName);
   }
}

您还可以通过属性传入模板名称,以避免在此处对它们进行硬编码。这有助于在您的应用程序中重用选择器。在您的 DataGrid 中,您可以使用选择器实例将数据模板添加到 Resources,并在模板列中使用它,如下所示:

<DataGrid ItemsSource="{Binding YourItemTypeList}" AutoGenerateColumns="False">
   <DataGrid.Resources>
      <DataTemplate x:Key="KonfTanimFalseTemplate">
         <TextBlock Text="{Binding LISTE_URUN}"/>
      </DataTemplate>
      <DataTemplate x:Key="KonfTanimTrueTemplate">
         <WrapPanel Orientation="Horizontal" MaxWidth="450">
            <TextBlock Text="{Binding Path=yeni_ModelTanim}"/>
            <TextBlock Text="{Binding Path=MT4}" Tag="{Binding Path=monStd4}" Style="{StaticResource cfgText}"/>
            <TextBlock Text="{Binding Path=MT5}" Tag="{Binding Path=monStd5}" Style="{StaticResource cfgText}"/>
            <TextBlock Text="{Binding Path=MT6}" Tag="{Binding Path=monStd6}" Style="{StaticResource cfgText}"/>
         </WrapPanel>  
      </DataTemplate>
      <local:KonfTanimDataTemplateSelector x:Key="KonfTanimDataTemplateSelector"/>
   </DataGrid.Resources>
   <DataGrid.Columns>
      <DataGridTemplateColumn CellTemplateSelector="{StaticResource KonfTanimDataTemplateSelector}"/>
   </DataGrid.Columns>
</DataGrid>

没有其他方法可以仅使用 XAML(不使用 C#)来做到这一点吗?

为复杂条件提供数据模板选择器并没有什么坏处。

然而,通常有一个标志来确定一个对象的类型是一个标志,表明相应的类应该被分成两种不同的类型。在这种情况下,您可以为这两种类型创建一个具有特定 DataType 的数据模板。不幸的是,自动按类型选择数据模板适用于其他项目控件,但在 DataGrid 或更具体的模板列中,您将不得不使用变通方法,这可能比仅仅使用更麻烦创建一个可以在其他列中重复使用的选择器。