Мы можем решить эту проблему следующим образом.
Мы можем получить детерминированную и упорядочиваемую ключевую функцию из типов с помощью 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))
Это - реальная боль по некоторой странной причине, необходимо использовать 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;
}
однажды было записью в блоге о том, как сделать это здесь , но ссылка мертва теперь.
Необходимо получить TreeViewItem
и затем установить IsSelected
на true
.
Это не так просто, как кажется, ссылка, предоставленная Стивеном, содержит решение, опубликованное в 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/