【问题标题】:Custom sorting Datagrid自定义排序数据网格
【发布时间】:2019-10-16 08:11:58
【问题描述】:

我有一个Datagrid,它只有一列,我想对其应用自定义排序。目前,当我搜索“Clark”这个词时,Datagrid 显示过滤结果如下:

David Clark
Clark David

但我想在第一行显示以FilterString 开头的项目:

Clark David
David Clark

如果用户搜索“大卫”,结果应该是:

David Clark
Clark David

这是我的数据网格:

<TextBox Name="SearchBox" KeyUp="SearchBox_OnKeyUp" />
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding WordsCollectionView}">
    <DataGrid.Columns>
         <DataGridTextColumn Width="*" Binding="{Binding}" />
    </DataGrid.Columns>
</DataGrid>

这是我的代码隐藏:

string[] words = { "David Clark", "Clark David", "John Smith"};
private string _filterString = "";

private ICollectionView _wordsCollectionView;
public ICollectionView WordsCollectionView
{
    get => _wordsCollectionView;
    set { _wordsCollectionView = value; OnPropertyChanged(); }
}

public MainWindow()
{
    InitializeComponent();

    WordsCollectionView = CollectionViewSource.GetDefaultView(words);
        WordsCollectionView.Filter = FilterResult;
        DataContext = this;
}

public string FilterString
{
    get => _filterString;
    set
    {
       _filterString = value;
       OnPropertyChanged();
       FilterCollection();
    }
}

public bool FilterResult(object obj)
{
    string str = obj as string;
    return str.Contains(FilterString);
}

private void FilterCollection()
{
    _wordsCollectionView?.Refresh();
}

private void SearchBox_OnKeyUp(object sender, KeyEventArgs e)
{
    FilterString = (sender as TextBox).Text;
}        

【问题讨论】:

  • 您是否尝试在CollectionViewSource 中使用SortDescriptions
  • 在我的场景中,SortDescription 无能为力。我已经编辑了问题。

标签: c# wpf datagrid


【解决方案1】:

您可以在ICollectionView 上设置过滤和排序:

WordsCollectionView.Filter = FilterResult
WordsCollectionView.SortDescriptions.Add(new SortDescription("", ListSortDirection.Ascending)); //words have no property

详情请参阅this MSDN page

请注意,这将产生您想要的排序,但对于更高级的排序,您应该考虑使用两列而不是一列,一列用于名字,一列用于姓氏。

【讨论】:

  • 对不起,我解释的不对。我已经编辑了我的问题。在这种情况下,SortDescriptions 无能为力。请再次阅读并编辑您的答案。谢谢。
【解决方案2】:

如果将WordsCollectionView 转换为ListCollectionView,则可以将其CustomSort 属性设置为IComparer,您可以在其中实现自定义排序逻辑。像这样的:

public MainWindow()
{
    InitializeComponent();

    WordsCollectionView = CollectionViewSource.GetDefaultView(words);
    WordsCollectionView.Filter = FilterResult;
    var listCollectionView = WordsCollectionView as ListCollectionView;
    if (listCollectionView != null)
        listCollectionView.CustomSort = new CustomSorter(this);
    DataContext = this;
}

private class CustomSorter : IComparer
{
    private readonly MainWindow _window;

    public CustomSorter(MainWindow window)
    {
        _window = window;
    }

    public int Compare(object x, object y)
    {
        int a = x?.ToString().IndexOf(_window.FilterString) ?? -1;
        int b = y?.ToString().IndexOf(_window.FilterString) ?? -1;
        return a.CompareTo(b);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多