gpt4 book ai didi

wpf - 不要从隐藏窗口调用 CanExecute 方法

转载 作者:行者123 更新时间:2023-12-03 10:29:33 25 4
gpt4 key购买 nike

我在我的 WPF 应用程序中使用 MVVM 模式。我正在尝试缓存我的窗口以提高性能。为此,我从不关闭它们,只是隐藏而不是关闭。所有隐藏的窗口都存储在字典中,因此我可以重复使用它们。当窗口再次打开时,我创建一个新的 View 模型并将其与缓存 View 相关联。

但这有一个问题,因为隐藏窗口不断调用 ViewModels 中命令的 CanExecute 方法。当用户打开和关闭很多窗口时,这会导致性能问题。

当我设置 Window.DataContext属性为 null 或执行 ClearValue(DataContextProperty)我实现了我的目标,但这有一个问题。如果我有任何两种方式绑定(bind),它们都会在从数据上下文解除绑定(bind)期间触发。因此,我的 View 模型中的某些值变为空。我不希望这样,因为在某些情况下,我会在隐藏 View 后从 ViewModel 中读取属性。

你能帮我解决主要问题吗(不要从隐藏窗口调用 CanExecute 方法)。

最佳答案

我认为您无法控制 CommandManager 的时间和地点。决定发射 RequerySuggested事件。您可能能够减轻性能损失的一种方法是在您的 ViewModel 上拥有一个属性,允许您抑制 CanExecute 的执行。 .每当 ViewModel 绑定(bind)的 View 隐藏时,您可以将此属性设置为

一个简单的例子

// Called when a view goes into hiding
myViewModel.SuppressCommandRequery = True

在您的 CanExecute 处理程序中,只需将此行放在方法的开头
public bool CanExecuteCommand(Object parameter) {

if (this.SuppressCommandRequery)
return;

// Continue processing the event...
}

我会指出,当 View 从隐藏状态中消失时,您需要特别注意禁用抑制。但是,在重新显示 View 导致 ViewModel 的新实例的情况下,这不是必需的。

或者,看看 this question其中谈到使用 DeletegateCommand 的实现来自 Prism MVVM 框架。我自己没有使用过这个,但看起来它可以解决你的一些问题。

关于wpf - 不要从隐藏窗口调用 CanExecute 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905387/

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