使用RelayCommand对象有什么好处

时间:2012-10-19 02:02:58

标签: mvvm-light

我想知道使用relay命令调用刷新屏幕的功能有什么好处。在我的应用程序中,我有以下中继命令设置。

private RelayCommand _refreshSitesCommand;
    public RelayCommand RefreshSitesCommand
    {
        get { return _refreshSitesCommand ?? (_refreshSitesCommand = new RelayCommand(RefreshSites)); }
    }

    private RelayCommand _refreshProvidersCommand;
    public RelayCommand RefreshProvidersCommand
    {
        get { return _refreshProvidersCommand ?? (_refreshProvidersCommand = new RelayCommand(RefreshProviders)); }
    }

    private async void RefreshSites()
    {
        var sitesStats = await _dataService.GetSiteStats();

        if (sitesStats != null)
        {
            SiteStats.Clear();

            foreach (var site in sitesStats)
            {
                SiteStats.Add(new SiteStatsViewModel(site));
            }

            SelectedSite = SiteStats[0];
        }
    }

    private async void RefreshProviders()
    {
        var providers = await _dataService.GetProviders();

        if (providers != null)
        {
            Providers.Clear();

            foreach (var provider in providers)
            {
                Providers.Add(new ProviderViewModel(provider));
            }

            SelectedProvider = Providers[0];
        }
    }

然后在我的代码中,我有以下调用来执行它。

RefreshProvidersCommand.Execute(null);
RefreshSitesCommand.Execute(null);

那么为什么这比调用RefreshSites和RefreshProviders函数要好。然后我不需要RelayCommand对象的代码。除了公开2个私有函数的功能之外,使用RelayCommand对象的好处不仅仅是使函数公开并调用它们。

3 个答案:

答案 0 :(得分:4)

MVVM部分是为了避免View类中的代码隐藏。

例如,如果要在响应按钮单击时执行操作,则可以指定Click事件处理程序或将Command属性分配给命令方法。 (命令比Click事件处理程序具有某些优势,但这不是问题。)

除了在View类中定义方法之外,没有其他好的选项来处理Click事件。您不能直接将Click事件分配给与View不同的类中的处理程序方法,并且只能绑定到属性,而不能绑定到方法。

但是,您可以将Command属性分配给绑定到实现ICommand接口的对象,例如:一个RelayCommand,该绑定可以是ViewModel对象的一个​​属性。这样就不必在视图的代码隐藏文件中定义Click事件处理程序,同时使ViewModel能够轻松启用/禁用命令,而无需了解View的具体实现。

人们可以争论宗教上避免代码隐藏的优点,但这不是问题。

答案 1 :(得分:1)

因为您可以绑定到视图中的Command。您无法绑定到视图中的方法(您可以,但绑定到命令更清晰)

答案 2 :(得分:1)

RelayCommand还实现了一个CanExecute方法,当将RelayCommand绑定到按钮时,该方法用于根据您为CanExecute方法指定的操作自动切换按钮的IsEnabled属性。