在我的 WPF 应用程序中,有一个可以从中选择项目的列表。然后,所选项目将显示在 ContentControl 中以进行进一步交互。根据所选项目的类型(可以有多个),在 ContentControl 中使用适当的 DataTemplate。到目前为止,这对于数据处理业务应用程序来说应该没什么不寻常的。
在每个 DataTemplate 中,都有多个 TextBox 和其他控件,它们将它们的值绑定到 ViewModel 类的特定属性。当从列表中选择另一个项目时,所有这些都会按预期更新。这些按钮还在正确的 ViewModel 实例上执行命令。
有一个上下文菜单项也执行命令,但这仅适用于第一个选定的项目。当从列表中选择相同类型的另一个元素时,重新使用已加载的模板视图,上下文菜单中的命令将始终在第一个选定的项目上执行。因此绑定不会更新为 ViewModel 的正确实例。
使菜单项使用正确的 ViewModel 实例的唯一方法是选择不同类型的项目,以便将模板更改为另一个视图。只有这样上下文菜单才能正确更新。
为什么菜单项命令不会像视图中的任何其他绑定一样更新?它在加载时获取一次,但在视图的生命周期内从未更新。
不是命令绑定未更新,而是 DataContext 已过时。这是一个众所周知的问题,一旦您知道正确的搜索词......
这是带有更多链接的解释:
http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda
这是该文章的相关部分:
解决方法是将菜单的数据上下文显式绑定到父级的数据上下文,如下所示:
<ContextMenu DataContext="{Binding PlacementTarget.DataContext,
RelativeSource={RelativeSource Self}}">
这个神奇的咒语告诉 WPF 在菜单的数据上下文和它的“放置目标”(即父级)数据上下文之间创建永久绑定,即使父级的数据上下文发生更改,该绑定仍然可以继续工作。仅当您期望父级的数据上下文在父级生命周期内发生更改时,才需要此咒语。
我之前发现的另一个解决方案是在 Opened 事件中手动将上下文菜单的 DataContext 设置为窗口的 DataContext。这需要在代码隐藏文件中添加额外的 C# 代码,并且可能需要适应不同的场景。所以我认为上面的仅 XAML 方式更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)