1

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

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

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

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

4

1 回答 1

2

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

一个简单的例子

// 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 导致 ViewModel 的新实例的情况下,这不是必需的。

或者,看看这个关于使用DeletegateCommandPrism MVVM 框架中的实现的问题。我自己没有使用过这个,但看起来它可以解决你的一些问题。

于 2012-08-10T16:39:00.330 回答