Gtk&x2B;和Vala:继承gtk.TreeModel

Gtk&x2B;和Vala:继承gtk.TreeModel,gtk,vala,Gtk,Vala,我有一个散列,其值构建在以下结构中: string type1_name -> Hash( string name_member -> DataStruct, string name_member -> DataStruct, string name_member -> DataStruct, string name_member -> DataStruc

我有一个散列,其值构建在以下结构中:

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个TreeView(扩展的实际树以分层方式显示所有列,并作为ListStore简要显示,仅显示数据结构的类型图标和名称,这些视图属于不同的父视图,可能同时显示)和1个具有相同数据图标表示的ListView。ATM我有一个管理数据(验证、序列化、反序列化等)的类,每个视图有3个模型,因此每次我更新/删除/创建项目时,我必须更新所有3个模型,这看起来不太好:(


我考虑的是创建一个实现Gtk.TreeModel的类,并提供可以用作所有3个视图的模型的公共数据源,但我找不到任何关于如何实现Gtk.TreeModel的文档。我试图查看GtkListStore(本机C实现)我看到它重新实现了很多方法。难道没有更简单的方法吗?

不,没有更简单的方法,但它真的不太难。查看C代码可能会让人感到害怕,但实际上只有十几种方法需要实现。它们在gtk+-3.0.vapi中标记为
abstract
(以及在valadoc.org的文档中),实现通常非常简单。如果你想要一个例子,我只能想到一个


标记为
virtual
的方法通常不需要实现,尽管您可以根据需要提供一个实现(通常用于优化,我猜Gtk.ListStore提供了很多实现)。

从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;
    }
    .....