gpt4 book ai didi

wpf - 需要帮助理解 MVVM 教程,RelayCommand

转载 作者:行者123 更新时间:2023-12-04 16:13:03 29 4
gpt4 key购买 nike

我正在阅读 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx教程

我不明白下面的代码试图做什么。

_saveCommand = new RelayCommand(param => this.Save(), param => this.CanSave ); 

正如真正的 Command 类中所定义的,CanSave 应该是一个带有参数的方法,因为它映射到谓词,因此它对应的方法应该有一个参数,对于 action 对象也是如此。请帮忙理解。

最佳答案

RelayCommand 使用传入其构造函数的函数(更准确地说是委托(delegate))来实现 CanExecuteExecute 方法。

在此示例中,传递了两个函数。首先介绍如何保存 - 只需调用 RelayCommand 所有者的 Save 方法。另一个描述了如何检查是否可以保存 - 只需检查所有者的 CanSave 属性的当前状态。

通过这种方式,您不必显式创建自己的 Command 类。

更新:

Thanks, but my questions is Save() is of type Action, defined as Action and as per my understanding Save() should have a parameter in order to work. But some reason it is able to work even without a paramter.

好吧,让我们仔细看看。

 _saveCommand = new RelayCommand(param => this.Save(), param => this.CanSave ); 

等同于(在 C# v2.0 的语法中)

 _saveCommand = new RelayCommand(
new Action<object>(delegate(object param){ this.Save(); }),
new Func<object,bool>(delegate(object param){ return this.CanSave; }));

因此,您创建的匿名函数包装了实际的方法,让您有权使用或不使用它们自己的参数。

如果你想更深入,上面的代码在后台编译成类似这样的东西:

 // it is OK to ignore methods arguments. 
// So, it's also OK to ignore them in anonymous methods as well
private void Save_Anonymous(object parameter){
this.Save();
}
private bool CanSave_Anonymous(object parameter){
return this.CanSave;
}

....

_saveCommand = new RelayCommand(new Action<object>(this.Save_Anonymous),
new Func<object, bool>(this.CanSave_Anonymous));

请注意,编译器可以选择其他策略来实现委托(delegate),具体取决于它们从周围上下文中包含的值。例如。如果您的匿名函数引用了一些局部变量,编译器将生成包含这些变量的匿名类并将方法放在此类中。

关于wpf - 需要帮助理解 MVVM 教程,RelayCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261565/

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