5

ListStore をモデルとして TreeView を使用しています。ユーザーが行をクリックすると、いくつかのアクションを実行したいのですが、セルの値を使用するのではなく、行を作成したデータを使用します...

現在、私は TreeView、TreeModel (ListStore)、および独自のデータ (皮肉なことにモデルと呼んでいます) を持っています。

したがって、質問は次のとおりです。

モデル (表示したいデータのオブジェクト表現) を持ち、ListStore にそのデータを入力して TreeView に表示するのは「正しい」でしょうか、それとも TreeModel の独自のバージョンを実装する (データをラップする) 方がよいでしょうか?モデル) データを表示するには?

また:

誰かが行をダブルクリックすると、アクティブ化された行へのパスを提供する RowActivated イベント (C#/Gtk# を使用) を取得できます。これで TreeIter を取得でき、それを使用してセルの値を取得できます。しかし、行が最初に構築されたデータ オブジェクトを見つけるためのベスト プラクティスは何ですか?\ (どういうわけか、この質問から最初の質問にたどり着きました。ツリーモデル...)

4

1 に答える 1

7

TreeModel を実装するのは非常に扱いにくい/難しいため、ほとんどの人は単にデータを「実際の」モデルから TreeStore または ListStore に同期します。

ストア内の列は、ビュー内の列とまったく一致する必要はありません。たとえば、実際の管理対象データ オブジェクトを含む列を持つことができます。

セルレンダラーを TreeView (ビジュアル) 列に追加すると、そのプロパティとストアの列の間にマッピングを追加できます。たとえば、1 つのストア列をテキスト セルレンダラーのフォントにマップし、別のストア列を同じセルレンダラーのテキスト プロパティにマップできます。cellrenderer を使用して特定のセルをレンダリングするたびに、マッピングを使用してストアから値を取得し、レンダリングする前にレンダラーのプロパティに適用します。

マッピングの例を次に示します。

treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4);

これは、ストア列 0 をレンダラーのtextGTK プロパティにマップし、ストア列 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 オブジェクトのプロパティを使用できるだけでなく、より複雑な表示ロジックを実装できるため、明らかにデータ関数の方がはるかに強力です。

于 2010-12-22T18:56:44.393 に答える