我该如何在wpf中使用RelayCommand?

41

我该如何在WPF中使用RelayCommand

2个回答

53

在WPF中并不存在RelayCommand,它只是一个外部类,在这篇MSDN文章被定义后才得到了广泛关注。如果想要使用它,您需要自己编写代码。

否则,您可以使用WPF工具包中的DelegateCommand,它比RelayCommand代码略微多一些额外功能。


啊,当我在回答时问题已经改变了。假设您正在使用如上所述定义的RelayCommand,则需要为其提供一个或两个委托:一个返回bool值,确定命令是否处于可运行状态,第二个不返回任何内容且实际运行命令。如果不提供“CanRun”委托,则命令将始终被认为处于有效状态。本文中使用的代码:

RelayCommand _saveCommand;
public ICommand SaveCommand
{
    get
    {
        if (_saveCommand == null)
        {
            _saveCommand = new RelayCommand(param => this.Save(),
                param => this.CanSave );
        }
        return _saveCommand;
    }
}

声明一个RelayCommand,当触发时调用Save()方法并将CanSave属性作为有效性测试返回。当在WPF中将此命令绑定到按钮时,按钮的IsEnabled属性将与ViewModel的CanSave属性匹配,并且当按钮被点击(假设它已启用)时,ViewModel上的Save()方法将被调用。


1
我有优势,因为昨天我查了这个答案:https://dev59.com/anRA5IYBdhLWcg3wsgPq#858303 - Martin Harris
3
我希望 MSDN 的文章代码示例不要混在一起,已经持续好几个月了。有人知道一个可以正常显示它们的镜像网站或其他什么方法吗? - Kyle Gobel
错误/过时的Relay命令确实存在,但它是https://mvvmlight.codeplex.com/工具包的一部分。 - MikeT

6
作为创建所有方法的 RelayCommand 包装器的替代方案,我建议使用一个免费的库和源代码 {BindTo Save()},它可以让你使用绑定。我创建了这个库来简化我的绑定过程,同时也使相对绑定更加容易。你可以在这里找到它: http://www.simplygoodcode.com/2012/08/simpler-wpf-binding.html

2
看起来很不错,虽然我没有测试过。但我建议你改进博客文章并解释实现细节。尽管将代码发布到Github上会非常好。还要考虑在StackOverflow的答案中放更多(一些!)代码。 - Mohammad Dehghan
+1 针对 @MD.Unicorn 的建议,将代码发布到 GitHub(或类似平台)上。如果该库能够作为 NuGet 包提供,那就更好了。 - Richard J Foster
1
链接断了,我想。 - Examath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接