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とは異なるクラスのハンドラーメソッドに直接割り当てることはできません。また、メソッドではなくプロパティにのみバインドできます。

ただし、 ICommandインターフェイスを実装するオブジェクト(RelayCommandなど)へのバインディングにCommandプロパティを割り当てることができ、そのバインディングをViewModelオブジェクトのプロパティに割り当てることができます。これにより、ビューのコードビハインドファイルでClickイベントハンドラーを定義する必要がなくなり、同時に、ビューの特定の実装について何も知らなくても、ViewModelでコマンドを簡単に有効化/無効化できるようになります。

コードビハインドを宗教的に回避することのメリットについて議論することはできますが、それは質問ではありませんでした。

于 2012-10-20T23:56:35.190 に答える
1

ビュー内のコマンドにバインドできるためです。ビュー内のメソッドにバインドすることはできません(できますが、コマンドへのバインドははるかにクリーンです)

于 2012-10-19T16:30:18.117 に答える
1

また、RelayCommandはCanExecuteメソッドを実装します。これは、RelayCommandをボタンにバインドするときに、CanExecuteメソッドに指定したアクションに基づいてボタンのIsEnabledプロパティを自動的に切り替えるために使用されます。

于 2012-10-23T18:14:45.220 に答える