2010-12-22 25 views
5

我正在使用TreeView和ListStore作爲模型。當用戶點擊一行我想採取一些行動,但不使用單元格中的值,但使用我創建的行的數據...如何正確使用GtkTreeView

目前我有TreeView,TreeModel(ListStore)和我自己的數據(我稱之爲具有諷刺意味的模型)..

所以問題是:

是不是「權利」有一個模型 - 數據的對象表示我要顯示和填充用ListStore該數據顯示在TreeView中,還是實現自己版本的TreeModel(包裝我的數據模型)以顯示數據會更好?

而且也:

如果有人雙擊一排,我可以得到RowActivated事件(使用C#/ GTK#),它提供了一個路徑激活一行。我可以得到一個TreeIter,並使用它可以獲得單元格的值。但是最好的做法是找到構建該行的數據對象?\ (不知何故,這個問題讓我想到了第一個問題 - 通過思考如果我試圖實現我的數據對象自己的TreeModel ...)

回答

7

這是相當尷尬/難以實現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.AddAttributeTreeViewColumn.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對象的屬性,還可以實現更復雜的顯示邏輯 - 例如,只有在單元格被實際渲染時,纔會懶散地處理派生值。

+0

感謝您的信息,我現在修改了ListStore來保存我的一個數據對象,並通過SetCellDataFunc設置CellRenderer。您能否詳細說明在商店的屬性和cellRenderer的屬性之間使用「映射」? – Nils 2010-12-23 16:20:00