Mono GTK#Nodeview Nodestore始终获取空引用
我已经按照GTK#Mono教程页面中的代码创建了一个GTK#Nodeview+NodeStore!我的更改是添加一个按钮,向NodeView添加新条目,并尝试使其可交互。我的问题是NodeView 选择更改事件正在使应用程序崩溃Mono GTK#Nodeview Nodestore始终获取空引用,mono,gtk#,visual-studio-mac,Mono,Gtk#,Visual Studio Mac,我已经按照GTK#Mono教程页面中的代码创建了一个GTK#Nodeview+NodeStore!我的更改是添加一个按钮,向NodeView添加新条目,并尝试使其可交互。我的问题是NodeView 选择更改事件正在使应用程序崩溃 using System; using Gtk; public partial class MainWindow : Window { Button button; NodeView nodeview; NodeStore nodestore;
using System;
using Gtk;
public partial class MainWindow : Window
{
Button button;
NodeView nodeview;
NodeStore nodestore;
[TreeNode(ListOnly = true)]
public class MyTreeNode : TreeNode
{
public MyTreeNode(string artist)
{
Artist = artist;
}
[TreeNodeValue(Column = 0)]
public string Artist;
}
public MainWindow() : base(WindowType.Toplevel)
{
Build();
var vbox = new VBox();
nodeview = new NodeView();
// Create a column with title Artist and bind its renderer to model column 0
nodeview.AppendColumn("Artist", new CellRendererText(), "text", 0);
nodestore = new NodeStore(typeof(MyTreeNode));
nodestore.AddNode(new MyTreeNode("temp"));
nodeview.NodeStore = nodestore;
nodeview.Selection.Changed += Selection_Changed;
button = new Button("Add New!!");
button.Clicked += Button_Clicked;
vbox.PackStart(nodeview, true, true, 0);
vbox.PackStart(button, false, true, 0);
Add(vbox);
ShowAll();
}
void Button_Clicked(object sender, EventArgs e)
{
nodestore.AddNode(new MyTreeNode("temp"));
}
void Selection_Changed(object sender, EventArgs e)
{
NodeSelection selection = (NodeSelection)sender;
if (selection != null)
{
MyTreeNode node = (MyTreeNode)selection.SelectedNode;
var a = node.Artist;
}
}
protected void OnDeleteEvent(object sender, DeleteEventArgs a)
{
Application.Quit();
a.RetVal = true;
}
}
当我在NodeView中选择一个节点时,应用程序会在没有任何通知的情况下崩溃。然后通过一些调试,我意识到当输入NodeSelection_时,Nodeview中的NodeStore变量总是空的。即使它正在向其中添加节点。。(它们正在呈现给nodeview)。这似乎是一个新版本,但在Mono 5.8及更旧版本中没有
解决方法是使用反射在NodeView类中设置“store”字段
typeof (NodeView).GetField ("store", BindingFlags.Instance | BindingFlags.NonPublic).SetValue (nodeview, nodestore);
如果在NodeView上设置nodestore的行之后添加上面的行,那么这将修复NodeView.nodestore为空的问题
nodeview.NodeStore = nodestore;
typeof (NodeView).GetField ("store", BindingFlags.Instance | BindingFlags.NonPublic).SetValue (nodeview, nodestore);
还请注意,您在Selection_Changed事件中的代码失败,因为发送方是Gtk.TreeSelection而不是Gtk.NodeSelection。我将选择更改为以下方法,该方法有效:
void Selection_Changed(object sender, EventArgs e)
{
NodeSelection selection = nodeview.NodeSelection;
if (selection != null)
{
MyTreeNode node = (MyTreeNode)selection.SelectedNode;
var a = node.Artist;
}
}
你能提供一个完全有效的例子吗?我不清楚nodeStore与NodeView关联的位置/时间。在Mono GTK示例中,它被创建并传递给NodeView的构造函数。现在上传了一个完整的示例!同样的问题+如果我可以的话!bug参考和解决方法的副本都非常有用。谢谢