這是相當尷尬/難以實現TreeModel的,所以一般人根本同步從他們的「真實」模型的數據爲TreeStore或ListStore。
在商店中的列不必以任何方式視圖匹配列。例如,您可以有一個包含實際託管數據對象的列。
當您添加的CellRenderer到一個TreeView(視覺)列,可以將其性能和商店的列之間添加映射。例如,您可以將一個商店列映射到文本cellrenderer的字體,將另一個商店列映射到同一個cellrenderer的文本屬性。每次使用cellrenderer渲染特定的單元格時,映射將用於從存儲中檢索值,並在呈現之前將它們應用於渲染器的屬性。
這裏的一個映射的一個例子:
treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4);
此地圖存儲列0到渲染器的text
GTK屬性和地圖存儲柱4到editable
屬性。對於GTK屬性名稱,您可以檢查GTK docs。請注意,上面的例子使用了一種方便的方法來添加一個列,添加一個渲染器並通過params添加任意數量的映射。要將映射直接添加到列(例如具有多個渲染器的列),請將渲染器打包到列中,然後使用TreeViewColumn.AddAttribute
或TreeViewColumn.SetAttributes
。
您還可以設置將被用來代替映射自定義數據的功能。這允許您直接設置渲染器的屬性(給定一個TreeIter和商店) - 因此,如果要顯示的所有數據都是從實際數據對象中平均派生的,那麼甚至可以讓您的商店僅包含一列這些對象,併爲所有視圖列使用數據funcs。
這裏有一個數據FUNC,它正是映射上面的例子做的一個例子:
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對象的屬性,還可以實現更復雜的顯示邏輯 - 例如,只有在單元格被實際渲染時,纔會懶散地處理派生值。
感謝您的信息,我現在修改了ListStore來保存我的一個數據對象,並通過SetCellDataFunc設置CellRenderer。您能否詳細說明在商店的屬性和cellRenderer的屬性之間使用「映射」? – Nils 2010-12-23 16:20:00