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

时间:2012-08-10 16:06:20

标签: wpf mvvm

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

但由于隐藏窗口在ViewModels中不断调用CanExecute命令方法,因此存在问题。当用户打开并关闭大量窗口时,这会导致性能问题。

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

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

1 个答案:

答案 0 :(得分: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的新实例的情况下,这不是必需的。

或者,请查看this question,其中讨论了如何使用Prism MVVM Framework中的DeletegateCommand实现。我自己没有用过,但看起来它可能会解决你的一些问题。