2012-10-19 129 views
2

我想知道使用relay命令調用刷新屏幕的函數的好處。在我的應用程序中,我有以下中繼命令設置。使用RelayCommand對象有什麼好處

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對象有什麼好處,而不僅僅是使這些函數公開並調用它們。

回答

1

因爲您可以綁定到視圖中的命令。你不能綁定到你的視圖中的方法(你可以,但綁定到命令更清潔)

+0

好的,所以它使得它可以很容易地綁定一個按鈕,以便在按下時運行refreshSitesCommand。這將代替按鈕的點擊/點擊事件,然後調用公共功能。正確? – smehaffie

+0

正確。你想避免背後的代碼 – vidalsasoon

3

MVVM部分是關於避免View類中的代碼隱藏。

例如,如果您想要對按鈕單擊作出響應,則可以分配Click事件處理程序或將Command屬性分配給命令方法。 (命令與Click事件處理程序相比有一定的優勢,但這不是問題。)

除了在View類中定義方法外,沒有其他好的選擇來處理Click事件。您不能直接將Click事件分配給與視圖不同的類中的處理程序方法,並且您只能綁定到屬性而不是方法。

但是,可以命令屬性設置爲結合分配給對象一個實現ICommand接口,例如一個RelayCommand,並且該綁定可以是您的ViewModel對象的屬性。這避免了必須在視圖的代碼隱藏文件中定義Click事件處理程序,同時讓您的ViewModel能夠輕鬆啓用/禁用命令,而無需瞭解View的特定實現。

有人可能會爭論宗教上避免代碼隱藏的優點,但這不是問題的問題。

1

RelayCommand還實現了CanExecute方法,該方法在將您的RelayCommand綁定到按鈕時,用於根據您爲CanExecute方法指定的操作自動切換按鈕的IsEnabled屬性。