gpt4 book ai didi

wpf - ContextMenu 命令绑定(bind)未随数据源更新

转载 作者:行者123 更新时间:2023-12-04 21:57:51 27 4
gpt4 key购买 nike

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

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

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

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

为什么菜单项命令不像 View 中的任何其他绑定(bind)那样更新?它在加载时获取一次,但在 View 的生命周期内永远不会更新。

最佳答案

不是 Command 绑定(bind)没有更新,而是 DataContext 过时了。这是一个广为人知的问题,一旦您知道了正确的搜索词...

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

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

这是该文章的相关部分:

The workaround is to explicitly bind menu's data context to parent's datacontext as follows:

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

This magical spell tells WPF to create a permanent binding between the menu's data context and its "placement target" (i.e. parent) data context, which continues to work even after parent's data context is changed. You need this spell only if you expect parent's data context to change during the life of the parent.

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

关于wpf - ContextMenu 命令绑定(bind)未随数据源更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com