首页 文章

ContextMenu命令绑定不使用DataSource更新

提问于
浏览
3

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

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

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

使菜单项使用正确的ViewModel实例的唯一方法是选择不同类型的项目,以便将模板更改为另一个视图 . 只有这样才能正确更新上下文菜单 .

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

1 回答

  • 4

    它不是没有更新的Command绑定,而是DataContext已经过时了 . 一旦你知道正确的搜索条件,这是一个众所周知的问题......

    以下是进一步链接的解释:

    http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda

    这是该文章的相关部分:

    解决方法是将菜单的数据上下文显式绑定到父的datacontext,如下所示:<ContextMenu DataContext =“{Binding PlacementTarget.DataContext,
    RelativeSource =
    }“>
    这个神奇的咒语告诉WPF在菜单的数据上下文和它的“放置目标”(即父级)数据上下文之间创建永久绑定,即使在父级的数据上下文改变之后,该上下文也会继续工作 . 只有当您希望父级的数据上下文在父级的生命周期内发生更改时,才需要此法术 .

    我之前发现的另一个解决方案是在Opened事件中手动将上下文菜单的DataContext设置为窗口的DataContext . 这需要代码隐藏文件中的其他C#代码,可能需要适应不同的场景 . 所以我认为上面的XAML方式更好 .

相关问题