Как программно выбрать объект в WPF TreeView?

Мы можем решить эту проблему следующим образом.

  1. Группировать по типу.
  2. Найти, какие типы сопоставимы, пытаясь сравнить один представитель каждого типа.
  3. Объединение групп сопоставимых типов.
  4. Сортировка объединенных групп, если это возможно.
  5. выход из (отсортированных) объединенных групп

Мы можем получить детерминированную и упорядочиваемую ключевую функцию из типов с помощью repr(type(x)). Обратите внимание, что здесь иерархия типов определяется репрезентацией самих типов. Недостатком этого метода является то, что если два типа имеют идентичные __repr__ (сами типы, а не экземпляры), вы будете «путать» типы. Это можно решить, используя ключевую функцию, которая возвращает кортеж (repr(type), id(type)), но я не реализовал это в этом решении.

Преимущество моего метода над Bas Swinkel - это более удобная обработка группы неуправляемые элементы. У нас нет квадратичного поведения; вместо этого функция отбрасывается после первого попытки упорядочения во время sorted ()).

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

def py2sort(iterable):
        by_type_repr = lambda x: repr(type(x))
        iterable = sorted(iterable, key = by_type_repr)
        types = {type_: list(group) for type_, group in groupby(iterable, by_type_repr)}

        def merge_compatible_types(types):
            representatives = [(type_, items[0]) for (type_, items) in types.items()]

            def mergable_types():
                for i, (type_0, elem_0) in enumerate(representatives, 1):
                    for type_1, elem_1 in representatives[i:]:
                         if _comparable(elem_0, elem_1):
                             yield type_0, type_1

            def merge_types(a, b):
                try:
                    types[a].extend(types[b])
                    del types[b]
                except KeyError:
                    pass # already merged

            for a, b in mergable_types():
                merge_types(a, b)
            return types

        def gen_from_sorted_comparable_groups(types):
            for _, items in types.items():
                try:
                    items = sorted(items)
                except TypeError:
                    pass #unorderable type
                yield from items
        types = merge_compatible_types(types)
        return list(gen_from_sorted_comparable_groups(types))

    def _comparable(x, y):
        try:
            x < y
        except TypeError:
            return False
        else:
            return True

    if __name__ == '__main__':    
        print('before py2sort:')
        test = [2, -11.6, 3, 5.0, (1, '5', 3), (object, object()), complex(2, 3), [list, tuple], Fraction(11, 2), '2', type, str, 'foo', object(), 'bar']    
        print(test)
        print('after py2sort:')
        print(py2sort(test))
48
задан akjoshi 12 December 2018 в 00:08
поделиться

3 ответа

Это - реальная боль по некоторой странной причине, необходимо использовать ContainerFromItem, чтобы получить контейнер, затем вызвать избранный метод.

//  selectedItemObject is not a TreeViewItem, but an item from the collection that 
//  populated the TreeView.

var tvi = treeView.ItemContainerGenerator.ContainerFromItem(selectedItemObject) 
          as TreeViewItem;

if (tvi != null)
{
    tvi.IsSelected = true;
}

однажды было записью в блоге о том, как сделать это здесь , но ссылка мертва теперь.

27
ответ дан Ed Plunkett 7 November 2019 в 12:23
поделиться

Необходимо получить TreeViewItem и затем установить IsSelected на true.

23
ответ дан Tim Cooper 7 November 2019 в 12:23
поделиться

Это не так просто, как кажется, ссылка, предоставленная Стивеном, содержит решение, опубликованное в 2008 году, которое может все еще работать, но не заботится о Virtualized TreeViews. Кроме того, в комментариях к этой статье упоминается множество других проблем. Без обид, но я тоже застрял с той же проблемой и не могу найти идеального решения. Вот ссылки на некоторые статьи / сообщения, которые мне очень помогли-

Как я могу расширять элементы в TreeView? - Часть III: http://bea.stollnitz.com/blog/?p=59

Программный выбор элемента в TreeView: http://blog.quantumbitdesigns.com/2008/07/22/programmatically-selecting-an-item-in-a-treeview/#respond

TreeView, TreeViewItem и IsSelected: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7e368b93-f509-4cd6-88e7-561e8d3246ae/

5
ответ дан 7 November 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: