Es bastante difícil/difícil de implementar TreeModel, por lo que la mayoría de la gente simplemente sincroniza los datos de su modelo "real" en un TreeStore o ListStore.
Las columnas de la tienda no tienen que coincidir con las columnas de la vista de ninguna manera. Por ejemplo, puede tener una columna que contenga sus objetos de datos administrados reales.
Cuando agrega un traductor de celdas a una columna TreeView (visual), puede agregar asignaciones entre sus propiedades y las columnas de la tienda. Por ejemplo, puede asignar una columna de tienda a la fuente de un dispositivo de escritura de texto, y otra columna de tienda a la propiedad de texto del mismo dispositivo de escritura de celda. Cada vez que se utiliza el Cellrenderer para renderizar una celda particular, las asignaciones se usarán para recuperar los valores de la tienda y aplicarlos a las propiedades del renderizador antes de que se renderice.
He aquí un ejemplo de un mapeo: almacene la columna
treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4);
Este mapas de 0 a text
GTK propiedad y almacenar los mapas de la columna del procesador de 4 a la propiedad editable
. Para los nombres de propiedad GTK, puede consultar el GTK docs. Tenga en cuenta que el ejemplo anterior utiliza un método de conveniencia que agrega una columna, le agrega un procesador y agrega una cantidad arbitraria de mapeo a través de params. Para agregar asignaciones directamente a una columna, por ejemplo, una columna con múltiples representadores, empaquete los representadores en la columna y luego use TreeViewColumn.AddAttribute
o TreeViewColumn.SetAttributes
.
También puede configurar una función de datos personalizada que se utilizará en lugar de asignaciones. Esto le permite establecer las propiedades del renderizador directamente, dado un TreeIter y la tienda, por lo tanto, si todos los datos que desea mostrar derivan trivialmente de sus objetos de datos reales, incluso podría hacer que su tienda solo contenga una sola columna de estos objetos y usan los datos de todas las columnas de vista.
He aquí un ejemplo de una func datos que hace exactamente lo que el ejemplo de mapeo anterior hace:
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);
});
Obviamente funciones de datos son mucho más potente, ya que permiten que no sólo permite utilizar las propiedades de objetos GTK más complejos, sino también para implementar lógica de visualización más compleja; por ejemplo, procesar valores derivados de forma perezosa solo cuando la celda se procesa realmente.
gracias por la información, ahora he modificado el ListStore para contener exactamente uno de mis objetos de datos y configuré el CellRenderer a través de SetCellDataFunc. ¿Podría elaborar sobre el uso de un "mapeo" entre las propiedades de la tienda y las propiedades de cellRenderer? – Nils
OK, agregué algunos ejemplos :) –
¡Gracias, esto ayuda mucho! – Nils