TreeModel を実装するのは非常に扱いにくい/難しいため、ほとんどの人は単にデータを「実際の」モデルから TreeStore または ListStore に同期します。
ストア内の列は、ビュー内の列とまったく一致する必要はありません。たとえば、実際の管理対象データ オブジェクトを含む列を持つことができます。
セルレンダラーを TreeView (ビジュアル) 列に追加すると、そのプロパティとストアの列の間にマッピングを追加できます。たとえば、1 つのストア列をテキスト セルレンダラーのフォントにマップし、別のストア列を同じセルレンダラーのテキスト プロパティにマップできます。cellrenderer を使用して特定のセルをレンダリングするたびに、マッピングを使用してストアから値を取得し、レンダリングする前にレンダラーのプロパティに適用します。
マッピングの例を次に示します。
treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4);
これは、ストア列 0 をレンダラーのtext
GTK プロパティにマップし、ストア列 4 をプロパティにマップしeditable
ます。GTK プロパティ名については、GTK docsを確認してください。上記の例では、列を追加し、それにレンダラーを追加し、params を介して任意の数のマッピングを追加する便利なメソッドを使用していることに注意してください。複数のレンダラーを含む列など、列にマッピングを直接追加するには、レンダラーを列にパックしてから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 オブジェクトのプロパティを使用できるだけでなく、より複雑な表示ロジックを実装できるため、明らかにデータ関数の方がはるかに強力です。