2

我想知道使用 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 对象比仅仅将函数公开并调用它们有什么好处。

4

3 回答 3

5

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

例如,如果您希望对按钮单击做出响应,则可以分配 Click 事件处理程序或将 Command 属性分配给命令方法。(命令比 Click 事件处理程序具有某些优势,但这不是问题。)

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

但是,您可以将 Command 属性分配给与实现 ICommand 接口的对象的绑定,例如 RelayCommand,并且该绑定可以是您的 ViewModel 对象的属性。这避免了必须在视图的代码隐藏文件中定义 Click 事件处理程序,同时使您的 ViewModel 能够轻松启用/禁用命令,而无需了解有关 View 的特定实现的任何信息。

人们可以争论虔诚地避免代码隐藏的优点,但这不是问题所在。

于 2012-10-20T23:56:35.190 回答
1

因为您可以绑定到视图中的命令。您不能绑定到视图中的方法(当然可以,但绑定到 Commands 更简洁)

于 2012-10-19T16:30:18.117 回答
1

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

于 2012-10-23T18:14:45.220 回答