Сортировка узлов TreeView

Я использую Telerik RadTreeView, чтобы показать иерархию папок. Пользователь должен иметь возможность добавлять / удалять / переименовывать папки в этом дереве. Пока это работает, но дерево должно сортироваться по алфавиту при каждом изменении дерева.

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

Моя базовая модель хранится в базе данных и доступна с помощью EF. По сути, это сущность TreeFolder с ассоциацией 1:n. EF позволяет мне получить доступ к дочерним папкам TreeFolder как EntityCollection.

Моя проблема здесь: Как я могу отсортировать EntityCollections? Пока я знаю, что это невозможно - я должен использовать обертку, такую ​​как CollectionViewSource. Это означало бы, что мне нужно будет создать новый класс "SortableTreeFolder" (или расширить частичный класс из EF), который содержит такой CollectionViewSource. Это означает, что мне нужно будет скопировать всех потомков в этот CollectionViewSource при загрузке дерева.

Есть ли возможность сортировать модель TreeView только с использованием свойств навигации EF?

РЕДАКТИРОВАТЬ: Попробовав разные вещи (спасибо Uwy), я также наткнулся на этот сайт: сортировка EF Collection

Там это говорит:

Хотя EntityCollection не реализует IList, он реализует IListSource, и CollectionViewSource вызовет метод IListSource.GetList для создания представления. EntityCollection.GetList на самом деле возвращает объект IBindingList, который не поддерживает сортировку. В результате представление коллекции EntityCollection не поддерживает сортировку по умолчанию.

Очевидно, что сортировать модель TreeView невозможно только с использованием свойств навигации EF. Я все еще ищу обходной путь, помимо управления второй (сортируемой) структурой данных.

1 ответ

(Из моих предыдущих комментариев)

По умолчанию привязки источника элементов WPF являются откатом к тому, что выдает CollectionViewSource.GetDefaultView() (по крайней мере, когда он находится в том же потоке). Вы можете попробовать сделать это рекурсивно для ваших сущностей, добавив описание сортировки.

public class MainWindowViewModel
{

    public void SetupCollectionView(IEnumerable<MyObject> entities)
    {
        foreach(var entity in entities)
        {
            CollectionViewSource.GetDefaultView(entity)
                .SortDescriptions.Add(new SortDescription(nameof(MyObject.Header), ListSortDirection.Ascending));
            this.SetupCollectionView(entity.Childs);
        }
    }
}

public class MyObject
{
    public string Header { get; set; }
    public int AnotherProperty { get; set; }

    public virtual IEnumerable<MyObject> Childs { get; set; }
}
Другие вопросы по тегам