更新GTK#中的NodeView单元

问题描述 投票:0回答:1

如何通过键盘输入文本并触发NodeView事件后如何使Edited单元格保留输入的值?

[每当我在单元格中输入一些文本并尝试确认更改时,我的编辑之前的旧值就会返回。

应该保留节点值的子类的属性永远不会用新值更新。

首先如何使文本输入NodeView单元格?

c# mono gtk# treenode
1个回答
2
投票

技巧是使用传递给事件处理程序的Path参数的Gtk.EditedArgs属性从存储中获取正确的节点并进行修改(您负责将更改从UI传播到模型中)。下面是一个完整的小示例。

给出以下Gtk.TreeNode实现:

[Gtk.TreeNode]
public class MyTreeNode : Gtk.TreeNode 
{        
    public MyTreeNode(string text)
    {
        Text = text;
    }

    [Gtk.TreeNodeValue(Column=0)]
    public string Text;
}

很容易按如下方式更改Text属性:

Gtk.NodeStore store = new Gtk.NodeStore(typeof(MyTreeNode));
store.AddNode(new MyTreeNode("The Beatles"));
store.AddNode(new MyTreeNode("Peter Gabriel"));
store.AddNode(new MyTreeNode("U2"));

Gtk.CellRendererText editableCell = new Gtk.CellRendererText();

Gtk.NodeView view = new Gtk.NodeView(store);
view.AppendColumn ("Artist", editableCell, "text", 0);
view.ShowAll();

editableCell.Editable = true;
editableCell.Edited += (object o, Gtk.EditedArgs args) => {
    var node = store.GetNode(new Gtk.TreePath(args.Path)) as MyTreeNode;
    node.Text = args.NewText;
};

注意:

  1. 使用args.Path从商店获取正确的MyTreeNode;和
  2. 将结果强制转换为MyTreeNode以能够访问Text属性。
© www.soinside.com 2019 - 2024. All rights reserved.