【发布时间】:2013-08-24 05:49:35
【问题描述】:
在通过键盘输入文本并触发Edited 事件后,如何使NodeView 单元格保留输入的值?
每当我在单元格中输入一些文本并尝试确认更改时,我编辑之前的旧值就会返回。
应该保存节点值的子类的属性永远不会用新值更新。
首先如何将文本输入到NodeView 单元格中?
【问题讨论】:
在通过键盘输入文本并触发Edited 事件后,如何使NodeView 单元格保留输入的值?
每当我在单元格中输入一些文本并尝试确认更改时,我编辑之前的旧值就会返回。
应该保存节点值的子类的属性永远不会用新值更新。
首先如何将文本输入到NodeView 单元格中?
【问题讨论】:
诀窍是使用传递给事件处理程序的Gtk.EditedArgs 参数的Path 属性从存储中获取正确的节点并进行修改(您负责将更改从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;
};
注意:
args.Path从商店获取正确的MyTreeNode;和MyTreeNode 以便能够访问 Text 属性。【讨论】:
args 提供了编辑单元格的路径,但该路径只包含行,不包含列。