Выборочная сортировка данных - PullRequest
0 голосов
/ 16 октября 2019

У меня есть 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;
}        

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Если вы приведете 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);
    }
}
1 голос
/ 16 октября 2019

Вы можете установить фильтрацию и сортировку для ICollectionView:

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

См. эту страницу MSDN для получения полной информации.

Обратите внимание, что это приведет кв сортировке, которую вы хотите, но для более сложной сортировки вы должны рассмотреть возможность иметь два столбца вместо одного, один для имени и один для фамилии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...