Довольно неудобно / сложно реализовать TreeModel, поэтому большинство людей просто синхронизируют данные из своей «реальной» модели в TreeStore или ListStore.
Столбцы в хранилище не обязательно должны совпадать со столбцами ввид никак.Например, у вас может быть столбец, содержащий ваши реальные объекты управляемых данных.
Когда вы добавляете cellrenderer в столбец TreeView (визуальный), вы можете добавлять сопоставления между его свойствами и столбцами хранилища.Например, вы можете сопоставить один столбец хранилища со шрифтом текстового cellrenderer, а другой столбец хранилища - со свойством text того же самого cellrenderer.Каждый раз, когда cellrenderer используется для визуализации конкретной ячейки, сопоставления будут использоваться для извлечения значений из хранилища и применения их к свойствам средства визуализации до его рендеринга.
Вот пример отображения:
treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4);
Это сопоставляет столбец хранилища 0 со свойством text
GTK средства визуализации и сопоставляет столбец 4 хранилища со свойством editable
.Для имен свойств GTK вы можете проверить документы GTK .Обратите внимание, что в приведенном выше примере используется удобный метод, который добавляет столбец, добавляет к нему средство визуализации и добавляет произвольное число отображений с помощью параметров.Чтобы добавить сопоставления непосредственно в столбец, например в столбец с несколькими средствами визуализации, упакуйте средства визуализации в столбец, затем используйте TreeViewColumn.AddAttribute
или TreeViewColumn.SetAttributes
.
Вы также можете настроить пользовательскую функцию данных, которая будетиспользуется вместо отображений.Это позволяет вам устанавливать свойства средства визуализации напрямую, учитывая TreeIter и хранилище - так что, если все данные, которые вы хотите отобразить, тривиально получены из ваших реальных объектов данных, вы можете даже иметь свое хранилище, содержащее только один столбецэти объекты и используют функции данных для всех столбцов представления.
Вот пример функции данных, которая делает именно то, что делает приведенный выше пример отображения:
treeColumn.SetCellDataFunc (renderer, delegate (TreeViewColumn col,
CellRenderer cell, TreeModel model, TreeIter iter)
{
var textCell = (CellRendererText) cell;
textCell.Text = (string) model.GetValue (iter, 0);
textCell.Editable = (bool) model.GetValue (iter, 4);
});
Очевидно, что функции данных - это многоболее мощные, поскольку они позволяют не только использовать свойства более сложных объектов GTK, но и реализовывать более сложную логику отображения - например, лениво обрабатывать производные значения только тогда, когда ячейка фактически отображается.