在我的WPF应用程序,有从选择项目列表。 然后所选择的项目将被显示在用于进一步交互的ContentControl中。 根据所选择的项目的类型(可以有若干个),一个适当的DataTemplate在ContentControl中使用。 到目前为止,这应该是没有什么不寻常的数据处理业务应用。
在每一个的DataTemplate,有他们的值绑定到视图模型类的特定属性的多个文本框和其他控制。 当选择列表中的其他项目,如预期所有这些被更新。 这些按钮还对视图模型的正确实例执行他们的命令。
还有的是,还执行一个命令一个上下文菜单项,但这只会对第一个选择项工作。 当从列表中选择的相同类型的另一元件时,已加载的模板视图重新使用,从上下文菜单中选择命令将始终在第一选择的项目执行。 因此,结合不更新到视图模型的正确实例。
使菜单项使用正确的视图模型实例的唯一方法是使模板更改为另一个视图选择不同类型的项目。 只有在上下文菜单中正确更新。
为什么不会在菜单项命令更新,就像任何其他视图中的绑定? 这是牵强从前装载,但从来没有更新的视图的寿命。
这不是命令绑定不更新,那就是已经过时的DataContext的。 这是一个众所周知的问题,一旦你知道正确的搜索字词...
下面是进一步的联系作出解释:
http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda
下面是文章的相关部分:
解决方法是菜单的数据上下文明确地绑定到父母的DataContext如下:
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
这种神奇的法术告诉WPF创建菜单的数据上下文和它的“放置目标”(即父母)的数据背景下,继续父母的背景数据即使改变工作之间的永久绑定。 你只需要,如果你希望父母的数据上下文父的生命周期内改变这一魔咒。
我以前发现的另一种解决方案是手动设置上下文菜单的的DataContext到窗口的DataContext在开业活动。 这就需要在代码隐藏文件的其他C#代码,并可能需要适应不同的场景。 所以我觉得XAML只以上方式较好。