Wpf ContextMenu命令绑定未随数据源更新

Wpf ContextMenu命令绑定未随数据源更新,wpf,binding,command,Wpf,Binding,Command,在我的WPF应用程序中,有一个列表可供选择项目。然后,所选项目将显示在ContentControl中,以便进一步交互。根据所选项目的类型(可以有多个),ContentControl中会使用适当的DataTemplate。到目前为止,这对于数据处理业务应用程序来说应该没有什么不寻常之处 在每个DataTemplate中,都有多个文本框和其他控件,它们将其值绑定到ViewModel类的特定属性。从列表中选择另一项时,所有这些项都会按预期更新。这些按钮还在ViewModel的正确实例上执行其命令 有一

在我的WPF应用程序中,有一个列表可供选择项目。然后,所选项目将显示在ContentControl中,以便进一步交互。根据所选项目的类型(可以有多个),ContentControl中会使用适当的DataTemplate。到目前为止,这对于数据处理业务应用程序来说应该没有什么不寻常之处

在每个DataTemplate中,都有多个文本框和其他控件,它们将其值绑定到ViewModel类的特定属性。从列表中选择另一项时,所有这些项都会按预期更新。这些按钮还在ViewModel的正确实例上执行其命令

有一个上下文菜单项也执行命令,但这只适用于第一个选定项。当从列表中选择相同类型的另一个元素时,重新使用已加载的模板视图,上下文菜单中的命令将始终在第一个选定项上执行。因此绑定不会更新为ViewModel的正确实例

使菜单项使用正确的ViewModel实例的唯一方法是选择不同类型的项,以便将模板更改为其他视图。只有这样,关联菜单才能正确更新


为什么菜单项命令不能像视图中的任何其他绑定一样更新?它在加载时获取一次,但在视图的生命周期内从未更新。

不是命令绑定没有更新,而是数据上下文过期了。这是一个众所周知的问题,一旦你知道正确的搜索词

下面是一个带有更多链接的解释:

以下是该文章的相关部分:

解决方法是显式地将菜单的数据上下文绑定到父级的数据上下文,如下所示:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext,
    RelativeSource={RelativeSource Self}}">

这个神奇的咒语告诉WPF在菜单的数据上下文和“placement target”(即父级)数据上下文之间创建一个永久绑定,即使父级的数据上下文发生更改,该绑定也会继续工作。只有当您希望父对象的数据上下文在父对象的生命周期内发生变化时,才需要此咒语

我以前发现的另一个解决方案是在打开的事件中将上下文菜单的DataContext手动设置为窗口的DataContext。这需要在代码隐藏文件中添加额外的C#代码,并且可能需要适应不同的场景。所以我认为上面的XAML唯一方法更好