Как правильно использовать GtkTreeView - PullRequest
5 голосов
/ 22 декабря 2010

Я использую TreeView с ListStore в качестве модели. Когда пользователь нажимает на строку, я хочу предпринять некоторые действия, но не с использованием значений в ячейках, а с использованием данных, из которых я создал строку из ...

В настоящее время у меня есть TreeView, TreeModel (ListStore) и мои собственные данные (которые я иронично называю моделью) ..

Итак, вопросы:

Правильно ли иметь модель - представление объекта данных, которые я хочу отобразить, и заполнить ListStore этими данными для отображения в TreeView, или было бы лучше реализовать собственную версию TreeModel (перенос моя модель данных) для отображения данных?

А также:

Если кто-то дважды щелкнет по строке, я могу получить событие RowActivation (используя C # / Gtk #), которое предоставляет путь к активированной строке. С этим я могу получить TreeIter и, используя это, я могу получить значение ячейки. Но как лучше всего найти объект данных, из которого строится строка? \ (Каким-то образом этот вопрос привел меня к первому вопросу - подумав, будет ли проще получить объект данных, если я попытаюсь реализовать свою собственную TreeModel ...)

1 Ответ

7 голосов
/ 22 декабря 2010

Довольно неудобно / сложно реализовать 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, но и реализовывать более сложную логику отображения - например, лениво обрабатывать производные значения только тогда, когда ячейка фактически отображается.

...