gpt4 book ai didi

mvvm-light - 使用 RelayCommand 对象有什么好处

转载 作者:行者123 更新时间:2023-12-03 07:05:10 25 4
gpt4 key购买 nike

我想知道使用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 个私有(private)函数的功能之外,使用 RelayCommand 对象比仅公开函数并调用它们还有什么好处。

最佳答案

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

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

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

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

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

关于mvvm-light - 使用 RelayCommand 对象有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com