Вам нужно включить группировку следующим образом:
myListView.IsGroupingEnabled = true;
myListView.GroupDisplayBinding = new Binding("GroupKey"); // See below
И затем добавить свои данные в группы (например, списки списков). Это часто означает, что вам нужно создать свой собственный класс, чтобы показать свои группы, например:
public class Grouping : ObservableCollection
{
// NB: This is the GroupDisplayBinding above for displaying the header
public K GroupKey { get; private set; }
public Grouping(K key, IEnumerable items)ac
{
GroupKey = key;
foreach (var item in items)
this.Items.Add(item);
}
}
И, наконец, добавьте свои данные в группы:
var groups = new ObservableCollection>();
// You can just pass a set of data in (where "GroupA" is an enumerable set)
groups.Add(new Grouping("GroupA", GroupA));
// Or filter down a set of data
groups.Add(new Grouping("GroupB",
MyItems.Where(a => a.SomeFilter())));
myListView.ItemSource = groups;
Привяжите свою ячейку в MyDataClass, как и раньше:
var cell = new DataTemplate(typeof(TextCell));
cell.SetBinding(TextCell.TextProperty, "SomePropertyFromMyDataClass");
cell.SetBinding(TextCell.DetailProperty, "OtherPropertyFromMyDataClass");
myListView.ItemTemplate = cell;
Подключитесь к ссылке в ответе @ pnavk. Обратите внимание на то, почему использовать шаблон K вместо строки в классе Grouping
, как настроить внешний вид заголовка и многое другое: http://motzcod.es/post/94643411707/enhancing- xamarinforms-ListView-с группировкой
Расширения C/C++ Python не связываются GIL. Однако действительно необходимо знать то, что Вы делаете. С http://docs.python.org/c-api/init.html :
глобальная блокировка интерпретатора используется для защиты указателя на состояние текущего потока. При выпуске блокировки и сохранении состояния потока, должен быть получен указатель состояния текущего потока, прежде чем блокировка выпущена (так как другой поток мог сразу получить блокировку и сохранить ее собственное состояние потока в глобальной переменной). С другой стороны, при получении блокировки и восстановлении состояния потока, блокировка должна быть получена прежде, чем сохранить указатель состояния потока.
, Почему я продолжаю так много детали об этом? Поскольку, когда потоки создаются из C, они, don’t имеют глобальную блокировку интерпретатора, и при этом нет структуры данных состояния потока для них. Такие потоки должны загрузить себя в существование, первым созданием структуры данных состояния потока, затем получением блокировки и наконец хранением их указателя состояния потока, прежде чем они смогут начать использовать API Python/C. Когда они сделаны, они должны сбросить указатель состояния потока, выпустить блокировку и наконец освободить их структуру данных состояния потока.
Да, призывает к расширениям C (C, стандартные программы, названные из Python), все еще подвергаются GIL.
Однако можно вручную выпустить GIL в расширении C, пока Вы стараетесь подтвердить его перед возвращением управления к VM Python.
Для получения информации смотрите на Py_BEGIN_ALLOW_THREADS
и Py_END_ALLOW_THREADS
макросы: http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
Извлеките Cython, он имеет синтаксис, аналогичный Python, но с несколькими конструкциями, такими как "cdef", функции быстрого быстрого доступа и заявление «с ногилом» (которое делает то, что говорит).