2010-12-22 28 views
5

Estoy usando un TreeView con un ListStore como modelo. Cuando el usuario hace clic en una fila, quiero tomar alguna medida pero no usar los valores en las celdas, pero usando los datos que creé en la fila ...Cómo usar GtkTreeView correctamente

Actualmente tengo TreeView, TreeModel (ListStore) y mis propios datos (que, irónicamente, que llamo modelo) ..

Así que las preguntas son:

¿es "derecho" a tener un modelo - una representación de objeto de los datos que quiero mostrar y llenar un ListStore con qué datos mostrar en un TreeView, o sería mejor implementar una versión propia de TreeModel (envolviendo mi modelo de datos) para visualizar los datos?

Y también:

Si alguien hace doble clic en una fila que puedo conseguir el evento RowActivated (usando C#/GTK #), que proporciona una ruta de acceso a la fila activa. Con eso puedo obtener un TreeIter y usarlo puedo obtener el valor de una celda. ¿Pero cuál es la mejor práctica para encontrar el objeto de datos a partir del cual se construyó la fila? \ (De alguna manera, esta pregunta me llevó a la primera, pensando que sería más fácil obtener el objeto de datos si traté de implementar propio TreeModel ...)

Respuesta

7

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.

+0

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

+0

OK, agregué algunos ejemplos :) –

+0

¡Gracias, esto ayuda mucho! – Nils

Cuestiones relacionadas