所以我刚刚发现了空合并三元运算符,但我似乎无法弄清楚为什么我的变量在下面的代码行中仍被设置为null。
MenuItem parent = (treeView.SelectedItem ?? treeView.Items[0]) as MenuItem;
对象treeView
确实有多个项目。
无论treeView
是否有选定的项目,变量始终为空。
感谢任何帮助,谢谢:)
答案 0 :(得分:5)
treeView.SelectedItem
可能是也可能不是null,但它永远不是MenuItem
。
treeView.Items[0]
可能是也可能不是null,但它永远不是MenuItem
。
这个表达......
(treeView.SelectedItem ?? treeView.Items[0])
...如果该值不为null,则返回treeView.SelectedItem
的值。如果该值为null,则表达式返回treeView.Items[0]
。可能更好地说“它返回第一个非空操作数”。
无论您获得哪一个,都可以使用as
尝试将其投放到MenuItem
。演员从未成功,因为您投射的实际对象永远不会被投射到Menuitem
。
as
会返回null
。
所以你总是得到null
。
当你遇到这样的情况时,输入一个断点并将鼠标悬停在表达式的所有操作数上。一旦你知道操作数到底是什么,你可以选择像(treeView.SelectedItem ?? treeView.Items[0])
这样的子表达式并将鼠标悬停在这些子表达式上。如果你有任何问题,不要只是试着盯着代码,并从像伯特兰罗素这样的第一原则中剔除它。查看调试器中的值将提供您从未想到的关键信息。
但是您真正的问题是,您在某种程度上我没有确定,使用MenuItems填充WPF TreeView,并且您希望将所选菜单项退出。我试图重现你所做的事情,我的树视图上的Items集合中充满了MenuItems,但是你说你看到的是TreeViewItems。所以我不确定发生了什么。
在任何情况下,这都是一种填充TreeView的坏方法。我建议绑定到TreeView的ItemsSource属性的迷你viewmodel类的集合。 Stack Overflow上有很多这方面的例子。这就是WPF希望你这样做的方式,而且我发现如果你不按照你想要的方式做事,WPF是非常不友好的。