C# 避免在wpf中的datagrid中的复选框列中过滤文本框

C# 避免在wpf中的datagrid中的复选框列中过滤文本框,c#,wpf,C#,Wpf,我有一个datagrid。列标题名是从一个xml文件绑定的。 现在我需要为datagrid中的标题模板添加过滤器文本框 没有文本框过滤器选项,数据网格如下所示。 添加过滤器文本框后,数据网格如下所示 我不想在第一列显示文本框,即复选框列,如何做到这一点? xaml代码附在下面 <UserControl .....> <UserControl.Resources> <ResourceDictionary>

我有一个datagrid。列标题名是从一个xml文件绑定的。 现在我需要为datagrid中的标题模板添加过滤器文本框

  • 没有文本框过滤器选项,数据网格如下所示。

  • 添加过滤器文本框后,数据网格如下所示

  • 我不想在第一列显示文本框,即复选框列,如何做到这一点? xaml代码附在下面

    <UserControl .....>
        <UserControl.Resources>
            <ResourceDictionary>
    
    
                <DataGridTemplateColumn  x:Key="CustomCheckBoxTemplate">
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate >
                            <CheckBox Name="ColumnHearderCheckBox" IsThreeState="True" PreviewMouseLeftButtonDown="OnHeaderCheckBoxMouseButtonDown" />
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate >
    
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox PreviewMouseLeftButtonDown="OnCellCheckBoxPreviewMouseLeftButtonDown" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor,
                                          AncestorType=DataGridRow}, Path=IsSelected,Mode=TwoWay}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
    
    
                </DataGridTemplateColumn >
    
                 <ContextMenu x:Key="ColumnHeaderContextMenu"
                    FontSize="{Binding PlacementTarget.FontSize, RelativeSource={RelativeSource Self}}">
                    <ContextMenu.ItemContainerStyle>
                        <Style TargetType="{x:Type MenuItem}" >
                            <EventSetter Event= "Click" Handler="OnContextMenuItemClicked" />
                            <Setter Property="IsCheckable" Value="True" />
                            <Setter Property="Header" Value="{Binding Header}" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Visibility}" Value="Visible">
                                    <Setter Property="IsChecked" Value="True"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Visibility}" Value="Collapsed">
                                    <Setter Property="IsChecked" Value="False"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Visibility}" Value="Hidden">
                                    <Setter Property="IsChecked" Value="False"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ContextMenu.ItemContainerStyle>
                </ContextMenu>
            </ResourceDictionary>
        </UserControl.Resources>
    
        <Grid Margin="5,0,0,0">
            <Grid.Resources>
                <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="Height" Value="30"/>
                    <Setter Property="Foreground" Value="WhiteSmoke"/>
                    <Setter Property="FontSize" Value="14"/>
                    <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"  >
                                    <Border x:Name="Border"
                                 Padding="2"
                                 Background="{TemplateBinding Background}"
                                 BorderBrush="{TemplateBinding BorderBrush}"
                                 BorderThickness="{TemplateBinding BorderThickness}">
                                        <Grid x:Name="LayoutGrid">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                     Path=ActualHeight}" />
                                            </Grid.ColumnDefinitions>
                                            <StackPanel Orientation="Vertical">
                                                <TextBlock Text="{Binding Content, RelativeSource=
                                             {RelativeSource Mode=TemplatedParent}}"/>
                                                <TextBox x:Name="txtId" Width="100"  />
                                            </StackPanel>
                                        </Grid>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
    
                </Style>
                <DataTemplate x:Key="CustomTemplate">
                    <StackPanel Orientation="Horizontal" >
                        <Image Source="{Binding Converter={StaticResource StringToImageConverter}}" Height="30" Width="30" Margin="30,0,0,0" HorizontalAlignment="Right"/>
                    </StackPanel>
                </DataTemplate>
                <ContextMenu  x:Key="RowMenu" DataContext="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}">
                    <MenuItem Header="Delete" Command="{Binding DeleteCommand}" CommandParameter="{Binding SelectedItems, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"  >
                    </MenuItem>
                    <MenuItem Header="Edit" Command="{Binding EditCommand}"/>
                </ContextMenu>
                <Style x:Key="DefaultRowStyle" TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
                    <Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
                </Style>
            </Grid.Resources>
            <DataGrid x:Name="dataGrid"  IsReadOnly="True" ItemsSource="{Binding PatientStudyList}"  SelectionMode="{Binding SelectionMode, Converter={StaticResource SelectionModeToStringConverter}}"
                      AlternationCount="2" GridLinesVisibility="Horizontal" AutoGenerateColumns="False"  BorderThickness="1" 
                      RowStyle="{StaticResource DefaultRowStyle}" HorizontalAlignment="Stretch">
    
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Unloaded">
                        <i:InvokeCommandAction Command="{Binding DataGridUnloadedCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <DataGrid.ColumnHeaderStyle>
                    <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                        <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenu}" />
                        <Setter Property="Height" Value="50" />
    
    
                    </Style>
                </DataGrid.ColumnHeaderStyle>
            </DataGrid>
        </Grid>
    </UserControl>
    

    您正在使用新的
    控制模板更改
    DataGridColumnHeader.Template

    CustomCheckBoxTemplate
    提供了一个
    DataGridTemplateColumn.HeaderTemplate
    as
    DataTemplate
    ,它以
    DataGridColumnHeader.ContentTemplate
    为目标。但是,您的
    ControlTemplate
    没有在内部使用
    DataGridColumnHeader.ContentTemplate
    ,因此
    CustomCheckBoxTemplate
    HeaderTemplate部分将被忽略

    如果它适合您,只需定义
    DataGridColumnHeader.ContentTemplate
    ,而不是在您的样式中定义
    DataGridColumnHeader.Template
    (行为会稍有不同)

    没有测试所有部分,因此我的建议中可能仍然存在错误

    编辑实际上,关于
    ContentPresenter
    的最后一部分并没有阻止
    txtId
    文本框。下面是一个想法,
    ControlTemplate
    使用
    触发器
    根据设置的
    ContentTemplate
    属性更改可见部分。注意:我在测试中更改了一些小细节,如
    列定义宽度

    <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"  >
        <Border x:Name="Border"
         Padding="2"
         Background="{TemplateBinding Background}"
         BorderBrush="{TemplateBinding BorderBrush}"
         BorderThickness="{TemplateBinding BorderThickness}">
            <Grid>
                <Grid x:Name="LayoutGrid"
                    Visibility="Collapsed">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                        <TextBox x:Name="txtId" Width="100"  />
                    </StackPanel>
                </Grid>
                <ContentPresenter
                    x:Name="TemplatedContent"
                    Visibility="Visible"
                    Content="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"
                    ContentTemplate="{TemplateBinding ContentTemplate}"/>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="ContentTemplate" Value="{x:Null}">
                <Setter Property="Visibility" TargetName="TemplatedContent" Value="Collapsed"/>
                <Setter Property="Visibility" TargetName="LayoutGrid" Value="Visible"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

    Hi,如果我的回答能解决您的问题(相关部分主要在编辑部分),或者需要任何澄清,我很乐意得到一些反馈。
    <!-- Old -->
    <TextBlock Text="{Binding Content, RelativeSource=
                                         {RelativeSource Mode=TemplatedParent}}"/>
    <!-- Replace by -->
    <ContentPresenter
        Content="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"
        ContentTemplate="{TemplateBinding ContentTemplate}"/>
    
    <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"  >
        <Border x:Name="Border"
         Padding="2"
         Background="{TemplateBinding Background}"
         BorderBrush="{TemplateBinding BorderBrush}"
         BorderThickness="{TemplateBinding BorderThickness}">
            <Grid>
                <Grid x:Name="LayoutGrid"
                    Visibility="Collapsed">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                        <TextBox x:Name="txtId" Width="100"  />
                    </StackPanel>
                </Grid>
                <ContentPresenter
                    x:Name="TemplatedContent"
                    Visibility="Visible"
                    Content="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"
                    ContentTemplate="{TemplateBinding ContentTemplate}"/>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="ContentTemplate" Value="{x:Null}">
                <Setter Property="Visibility" TargetName="TemplatedContent" Value="Collapsed"/>
                <Setter Property="Visibility" TargetName="LayoutGrid" Value="Visible"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>