DataGrid кастомная сортировка

265
07 октября 2017, 18:00

Необходимо решение данного вопроса :

Есть DataGrid. В него я кладу ObservableCollection<T>. Конечно можно туда положить ListCollectionView, но это мне не поможет. Так как :

  1. Я пишу на .net 4.0, в .net 4.0 нету IsLiveFiltering и LiveShaping.
  2. Я написал свой маленький ListCollectionView из костылей, где у меня две ObservableCollection<T>. Одна выполняет функцию SilentArray как в ListCollectionView - просто контейнер, и другая выполняет функцию CollectionView которая торчит наружу в UI. Я слежу за изменениями в своем "SilentArray" и решаю по фильтру что с ним делать - удалить из View если он там есть, оставить или добавить (исходя из того - подходит под фильтр или нет).

Сейчас я столкнулся с проблемой что мне нужна "живая сортировка". Допустим у вас есть лист из 10 элементов. Числа. Отсортированы они по возрастанию. И вдруг одно число поменялось, естественно в меньшую сторону или в большую. В данный момент ничего не происходит.

Но я подумал и решил - можно взять и бинарным поиском найти местечко в коллекции под данный итем. Это быстрее чем обычная сортировка DataGrid. Сравните сложность быстрой сортировки и бинарного поиска.

Но проблема в том что я не могу своей DataGrid (exDataGrid - расширенной). Обнови свой view, он просто не реагирует. Кусок кода - к чему я пришел в своих размышлениях

public class ExDataGrid : DataGrid
{
    private readonly object m_sync = new object();
    public static readonly DependencyProperty PropertyTypeProperty = 
        DependencyProperty.Register("ReleavntCollectionView", typeof (RelevantCollectionView), typeof (ExDataGrid), 
            new FrameworkPropertyMetadata()
            {
                DefaultValue = null,
            });
    public RelevantCollectionView ReleavntCollectionView
    {
        get { return (RelevantCollectionView) GetValue(PropertyTypeProperty); }
        set { SetValue(PropertyTypeProperty, value); }
    }
    protected override void OnSorting(DataGridSortingEventArgs _e)
    {
        _e.Handled = true;
        PrepareSort(_e.Column);
        if (ReleavntCollectionView.IsCanSort)
        {
            SetSortPropertyToColumn(_e.Column);
            ReleavntCollectionView.SortByField(_e.Column.SortMemberPath, _e.Column.SortDirection.Value);
        }
    }
    private void PrepareSort(DataGridColumn _sortColumn)
    {
        if(_sortColumn == null)
            throw new ArgumentNullException("_sortColumn");
        if(!CanUserSortColumns || !_sortColumn.CanUserSort)
            return;
        if(!Columns.Any())
            return;
        foreach (var column in Columns)
        {
            if(column == _sortColumn)
                continue;
            column.SortDirection = null;
        }
    }
    private void SetSortPropertyToColumn(DataGridColumn _sortColumn)
    {
        if(_sortColumn == null)
            throw new ArgumentNullException("_sortColumn");
        ListSortDirection sortDirection = ListSortDirection.Ascending;
        if (_sortColumn.SortDirection.HasValue && _sortColumn.SortDirection == ListSortDirection.Ascending)
        {
            _sortColumn.SortDirection = ListSortDirection.Descending;
        }
        else
        {
            _sortColumn.SortDirection = sortDirection;
        }
    }
}
READ ALSO
Как открыть в visual studio решение для UWP?

Как открыть в visual studio решение для UWP?

Когда я открываю решение для UWP в visual studia то у меня выскакивает такой вот диалог:

224
&ldquo;Съедание&rdquo; части элементов формы

“Съедание” части элементов формы

Пишу программу с интерфейсом, сделал что-то подобноеВид из редактора Студии:

183
Как работает объявление let в for

Как работает объявление let в for

Все знают что объявление:

163
angularjs ng-click

angularjs ng-click

привет проблема с обработкой нажатия

169