为什么要将 null 分配给此变量?

Why is null being assigned to this variable?

所以我刚刚发现了 null 合并三元运算符,但我似乎无法弄清楚为什么我的变量在下面的代码行中仍被设置为 null。

MenuItem parent = (treeView.SelectedItem ?? treeView.Items[0]) as MenuItem;

对象 treeView 确实有多个项目。

无论 treeView 是否有选定的项目,变量始终为空。

任何帮助将不胜感激,谢谢:)

treeView.SelectedItem 可能为 null,也可能不为 null,但它绝不是 MenuItem.

treeView.Items[0] 可能为 null,也可能不为 null,但它绝不是 MenuItem.

这个表达式...

(treeView.SelectedItem ?? treeView.Items[0])

...returns treeView.SelectedItem 的值(如果该值不为空)。如果该值为 null,则表达式 returns treeView.Items[0]。最好说“它 returns 第一个非空操作数”。

无论你得到哪个,你都可以使用 as 尝试将其转换为 MenuItem。转换永远不会成功,因为您正在转换的实际对象永远无法转换为 Menuitem.

as returns null 无法转换时。

所以你总是得到 null.

当你遇到这种情况时,放置一个断点并将鼠标悬停在表达式的所有操作数上。一旦您知道操作数 的真正含义 ,您就可以 select 子表达式,例如 (treeView.SelectedItem ?? treeView.Items[0]) 并将鼠标悬停在它们上面。如果您有任何疑问,请不要像 Bertrand Russell 那样只是试图盯着代码,然后从第一原则中找出答案。查看调试器中的值将提供您从未想过的关键信息。

更新

但您真正的问题是,您以我尚未确定的某种方式填充了带有 MenuItems 的 WPF TreeView,并且您想要取回 selected 菜单项。我试图重现你所做的,我的树视图上的项目集合充满了 MenuItems,但你说你看到的是 TreeViewItems。所以我不确定发生了什么。

我觉得这在任何情况下都是填充 TreeView 的糟糕方法。我建议将迷你视图模型 class 的集合绑定到 TreeView 的 ItemsSource 属性。 Stack Overflow 上有很多这样的例子。这就是 WPF 希望您做事的方式,而且我发现如果您不按照它希望您做的方式做事,WPF 会非常不友好。