通过键入在 WPF 数据表格中查找记录

3

我有一个数据网格,它绑定了可观察成员集合。现在我想通过输入成员名称在数据网格中查找成员。我尝试过使用IsTextSearchEnable属性但是无法搜索。以下是我的XAML代码。

<DataGrid Name="dgOtherCharges" AutoGenerateColumns="False" RowHeight="25" Grid.Row="4" AlternatingRowBackground="{StaticResource AlternateRowBackgroundBrush}" Grid.ColumnSpan="3" IsTextSearchEnabled="True" TextSearch.Text="Name"
              CanUserAddRows="False" HeadersVisibility="Column" SelectionUnit="Cell" ItemsSource="{Binding Path=MembersCollection,Mode=TwoWay}"  HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
              VerticalGridLinesBrush="{StaticResource GridLineColorBrush}" HorizontalGridLinesBrush="{StaticResource GridLineColorBrush}">
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridCell}">
                    <Style.Triggers>
                        <Trigger Property="DataGridCell.IsSelected" Value="True">
                            <Setter Property="Background" Value="{StaticResource ButtonSelectedBrush}"  />
                            <Setter Property="BorderBrush" Value="#A8E3FC" />
                            <Setter Property="Foreground" Value="Black" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>

            <DataGrid.Columns>

                <DataGridCheckBoxColumn Binding="{Binding IsCheck,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="50">
                    <DataGridCheckBoxColumn.ElementStyle>
                        <Style TargetType="CheckBox">
                            <Setter Property="HorizontalAlignment" Value="Center"/>
                            <Setter Property="VerticalAlignment" Value="Center"/>
                        </Style>
                    </DataGridCheckBoxColumn.ElementStyle>
                </DataGridCheckBoxColumn>
                <DataGridTextColumn Header="Member Name" Binding="{Binding Name,Mode=TwoWay}" IsReadOnly="True" Width="*"/>


            </DataGrid.Columns>
        </DataGrid>

我需要一个快速的解决方案,伙计们。
2个回答

9

我今天偶然发现了这个问题,寻找解决同样问题的方法。虽然在2012年似乎没有功能,但现在有了。

因此,为了未来参考,以下是我的当前解决方案,其中包括三个添加的属性:IsTextSearchCaseSensitiveIsTextSearchEnabledTextSearch.TextPath

<DataGrid ItemsSource="{Binding Path=Directories, Mode=OneWay}"
          SelectedItem="{Binding Path=SelectedDirectory, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          EnableRowVirtualization="False"
          EnableColumnVirtualization="True"
          VirtualizingStackPanel.IsVirtualizing="False"
          VirtualizingStackPanel.VirtualizationMode="Standard"
          IsTextSearchCaseSensitive="False"
          IsTextSearchEnabled="True"
          TextSearch.TextPath="Name">
   <DataGrid.Columns>
      <DataGridTemplateColumn Header="Name" SortMemberPath="Name" />
   </DataGrid.Columns>
</DataGrid>

您的目录集合已应用筛选器?您是否需要绑定到TextSearch.Text? - David Graham
没有应用筛选器到集合中。您不需要绑定到 TextSearch.Text,它只应该是一个字符串值,表示您要在其中执行文本搜索的属性名称。 - Herman Cordes
感谢你解释清楚。我需要更深入地了解,因为我无法理解它是如何工作的。也许我将其与过滤器混淆了。 - David Graham
1
啊,我想我明白你的困惑了。TextSearch 只是为了通过键入要查找的值的前几个字符来快速选择列表中正确的项目。它不进行任何过滤。 - Herman Cordes

5
<TextBox TextChanged="TextBox_TextChanged"/>

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
      var view = CollectionViewSource.GetDefaultView((DataContext as MyViewModel).MembersCollection);
      view.Filter = o => (o as Member).Name.Contains((sender as TextBox).Text);
}

我希望你能够快速地进行翻译 :)


我很感激。您介意提供一些使用DataGrid而不是单独的文本框的XAML代码吗? - lordhusnain
我的意思是如何在XAML中使用像IsTextSearchEnabled这样的属性,使数据网格可搜索。 - lordhusnain
TextSearch继承自ItemsControl,据我所知,在DataGrid中不受支持。 - Dtex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接