将Gtk.NodeView转换为C#中的另一个类

时间:2019-03-12 16:04:50

标签: c# gtk gtk#

我刚接触Gtk#(不到一周),因此希望这不是一个完全错误的问题:

我在Gtk#窗口中有一个NodeView小部件。这只是歌曲列表。当我单击歌曲时,我想更新“当前正在播放:”标签。

到目前为止,我的代码如下:

protected void onSongSelected(object o, RowActivatedArgs args)
    {
        object selection = o;
        //something needs to go here
        currentSongName.Text = selection.ToString();
    }

现在,我知道这是不正确的。但是,这给了我的是对象o的类型(以及变量“ selection”),即“ Gtk.NodeView”。但是,我不知道该如何使用NodeView来让我从所选节点访问任何信息。

我尝试按照此页面上的指南来解决问题: https://www.mono-project.com/docs/gui/gtksharp/widgets/nodeview-tutorial/

我创建了一个称为MasterLibrary的TreeNode类(与示例几乎相同),并尝试将o强制转换为MasterLibrary类型,如下所示:

object selection = (MasterLibrary)o;

但是,这导致我的程序崩溃,因为说将NodeView强制转换为MasterLibrary类是无效的。

在解决此问题方面的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

可以使用Selection属性来标识NodeView的选定项。您需要使用 TreeIter TreeModel 如下:

Gtk.TreeIter _i;
Gtk.TreeModel _m;
if (myNodeView.Selection.CountSelectedRows () > 0) {
  myNodeView.Selection.GetSelected (out _m, out _i);
  if (_m != null && _i != null) {
    currentSongName.text = _m.GetValue (_i, 0); // assuming your song name is in column 0 of the NodeView.
  }
}

请注意,最好先对选定的行计数进行检查,以避免出现空引用异常,但我同时要这样做,并且还要对模型进行空检查,并基于防御性编程进行迭代。如果其他列(即col 0以外)包含您的歌曲名称,则只需将列号从0更改为其他名称即可。