我想知道使用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对象的好处不仅仅是使函数公开并调用它们。
答案 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属性。