Wpf 我可以不说“我可以不说”吗;CanExecute“;MVVM模式中的调用

Wpf 我可以不说“我可以不说”吗;CanExecute“;MVVM模式中的调用,wpf,mvvm,suppress,canexecute,Wpf,Mvvm,Suppress,Canexecute,我正在使用WPF和MVVM模式处理一个树结构。我首先创建20个根节点,并在单击每个节点时延迟加载子节点。比如说。。。如果我有以下资料: Level 1 Level 1.1 Level 2 Level 3 Level 3.1 Level 3.2 级别1、2和3在运行时加载。在单击级别1.1、3.1和3.2各自的父级之前,不会加载它们。低于1.1等的级别通过单击其父级以相同方式加载 我的问题是,当我单击Level 1.1加载其子级时,会检查Level 1.1的“CanExe

我正在使用WPF和MVVM模式处理一个树结构。我首先创建20个根节点,并在单击每个节点时延迟加载子节点。比如说。。。如果我有以下资料:

Level 1
    Level 1.1
Level 2
Level 3
    Level 3.1
    Level 3.2
级别1、2和3在运行时加载。在单击级别1.1、3.1和3.2各自的父级之前,不会加载它们。低于1.1等的级别通过单击其父级以相同方式加载

我的问题是,当我单击Level 1.1加载其子级时,会检查Level 1.1的“CanExecute”方法以及Level 1.1的每个子级的所有根级项目。如果孩子太多,这会造成相当多的时间浪费


我的问题是,我是否可以抑制对“CanExecute”的呼吁?我没有必要把它称为这些子级别,我想绕过它。我对MVVM框架非常陌生,所以我不确定这是否可行。

如果您在视图模型中使用Prism(WPF和SilverLight的复合应用程序指南)“DelegateCommand”,则必须显式调用command.RaiseCanecuteChanged,只要您希望对其执行调用即可。

不幸的是,我们没有使用Prism。我们正在使用统一框架。我应该在我的问题中澄清这一点。您不需要使用Prism来使用DelegateCommand。您可以直接从源代码或InterWeb上DelegateCommand的任何其他实现中删除它。这是一个非常简单的类。也就是说,这还不足以解决你的“问题”。这是因为无论CanExecuteChanged事件如何,WPF都会调用“CanExecute”。我把“问题”放在引号里,因为我怀疑它是否真的是个问题。如果您的CanExecute实现是快速和小的(应该是),那么它就不重要了。通过抑制对CanExecute的调用,您试图解决什么问题?Brian说得对,您不需要使用Prism来使用DelegateCommand。但是把东西从库中拽出来,想用在哪里就用在哪里,几乎总是一个维护问题。也就是说,我认为我的声明是,为了调用CanExecute,您必须始终显式地调用RaiseCanExecuted,否则返回错误。我的prism应用程序的结构是这样的,但不一定总是这样。@Brian和NVM感谢您的回复!!我的问题是,对于大量数据,树的加载速度非常慢。我检查了SQL调用和对象创建,它们在短时间内运行。在调试过程中,我逐行进行,每次添加新的树项时,都会注意到所有“CanExecute”函数调用。由于执行SQL调用和初始对象创建的方法很快完成,因此调试调用中只剩下多个“CanExecute”调用。您可以尝试在树状视图中使用UI虚拟化。你到底在CanExcute干什么?