GTK中的TreeView#更新ListStore中的列

时间:2014-06-25 09:58:59

标签: c# treeview gtk# gtktreeview

所以我在GTK#中有一个TreeView,我用一个空的TreeModelSort(没有列)预加载它。

在运行时,我让用户选择他们想要添加的列,当单击按钮时,我创建一个包含这些列的新ListStore,从中创建TreeModelFilter和TreeModelSort。然后,我通过使用反射将值附加到TreeModelSort,以根据列获取正确的值。一切正常,我最终得到了一个TreeModelSort,其中包含我感兴趣的列和数据。

当我尝试用我刚创建的新TreeView.Model替换旧的TreeView.Model时出现问题。没有例外,它可以很好地替换它,但新的列和数据不会显示在表中。

关于我可能遗失的任何想法?

我正在尝试允许或者是否需要从屏幕中删除TreeView并将其替换为新的?

编辑:或者即使我可以在列表存储中拥有所有列但只在TreeView中显示一些选定的列,这可能吗?我发现的所有教程都有一对一的ListStore和TreeView之间的列映射。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

(没有GTK#的经验,但有很多其他语言的gtk经验)。 在我看来,你可能会在这里混合视图和模型。要在视图中显示列,您不仅需要在模型中使用它们(正如您所做的那样),还需要将渲染的单元格添加到视图中,并将它们与模型中的特定列绑定。 我将在下面显示一些伪代码,并让您转换为gtk#:

  • 创建一个新的GtkTreeViewColumn
  • 创建一个新的GtkCellRendererText。
  • 通过调用gtk_tree_view_column_pack_start
  • 将其添加到列中
  • 向渲染器添加属性,例如告诉它应该渲染模型的哪一列。例如:      gtk_cell_layout_add_attribute(column,renderer," text",0)

    显示模型的第一列(解释为文本)

事实上,我不会像你那样实现可自定义的列。相反,我从一开始就会拥有一个包含所有可能列及其值的模型。然后,当用户选择要显示的列时,我将从视图中添加(或删除)单元格渲染器和/或GtkTreeViewColumns。

其中一个好处是您可以拥有相同模型的多个视图,每个视图都显示不同的列。