我的哈希值包含以下结构:
string type1_name -> Hash(
string name_member -> DataStruct,
string name_member -> DataStruct,
string name_member -> DataStruct,
string name_member -> DataStruct
),
string type2_name -> Hash(
string name_member -> DataStruct,
string name_member -> DataStruct,
string name_member -> DataStruct,
string name_member -> DataStruct
),
/// etc
问题是我有3个视图:2个TreeViews(扩展的实际树以层次结构方式显示所有列,简要说明ListStore仅显示DataStruct的类型图标和名称,这些视图由不同的父项拥有,并且可能同时显示)和1个ListView与相同数据的图标表示。 ATM我有一个类管理数据(验证,序列化,反序列化,...)和每个视图的3个模型,所以每次我更新/删除/创建项目我必须更新所有3个模型,这看起来不太好:(
我想到的是创建一个实现Gtk.TreeModel的类并提供可用作所有3个视图的模型的公共数据源,但是我找不到有关如何实现gtk.TreeModel的任何文档。我试图通过GtkListStore(本地C实现)查看,我看到它重新实现了很多方法。有没有更简单的方法?
答案 0 :(得分:5)
不,没有更简单的方法,但实际上并不太难。查看C代码可能会令人生畏,但实际上只需要执行十几种方法。它们在gtk + -3.0.vapi中标记为abstract
(在valadoc.org的Gtk.TreeModel文档中)。并且实现通常非常简单。如果你想要一个例子SQLHeavyGtk.Model是我唯一能想到的。
标记为virtual
的方法通常不需要实现,但是如果需要可以提供一个(通常用于优化,我猜Gtk.ListStore提供了很多)
答案 1 :(得分:3)
从Gtk.TreeStore / Gtk.ListStore简单继承并明确设置列类型。 树视图列设置为单元格渲染器和您想要显示的数据回调函数。
要将MyCommon.data1映射到treeview1.column = 0
的Vala示例public class MyCommon : GLib.Object {
string data1 {get; set; }
string data2 {get; set; }
}
public class Store : Gtk.TreeStore {
public Store() {
set_column_types( new GLib.Type[] { typeof(MyCommon) } );
}
public set_treeview1(Gtk.TreeView treeview) {
treeview.insert_column_with_data_func(0, "data1", new Gtk.CellRendererText(), tree_cell_data1);
treeview.insert_column_with_data_func(1, "data2", new Gtk.CellRendererText(), tree_cell_data2);
treeview.model = this;
}
protected MyCommon? my_common(Gtk.TreeModel model, Gtk.TreeIter iter) {
GLib.Value data;
model.get_value(iter, 0, out data);
return (MyCommon)data;
}
public void tree_cell_data1(Gtk.TreeViewColumn column, Gtk.CellRenderer cell,
Gtk.TreeModel model, Gtk.TreeIter iter) {
MyCommon? property = my_common(this,iter);
if(property != null) (cell as Gtk.CellRendererText).text = property.data1;
}
public void tree_cell_data2(Gtk.TreeViewColumn column, Gtk.CellRenderer cell,
Gtk.TreeModel model, Gtk.TreeIter iter) {
MyCommon? property = my_common(this,iter);
if(property != null) (cell as Gtk.CellRendererText).text = property.data2;
}
.....