【发布时间】:2014-12-29 05:08:56
【问题描述】:
我有一个应用程序,它在 MVVM 架构中使用 RelayCommands。
似乎在某个时间点,CanExecute 方法不再得到正确的重新评估。 (也许安装 VS2013 的最新更新会导致这种情况?)。
下面的代码看起来很基本,我真的希望有人能帮助我。
中继命令声明:
public RelayCommand BrowseTorrentSiteCommand { get; private set; }
中继命令实例化:
BrowseTorrentSiteCommand = new RelayCommand(BrowseTorrentSiteOnExecuted, BrowseTorrentSiteOnCanExecute);
CanExecute 的实现:
private bool BrowseTorrentSiteOnCanExecute()
{
return _mainViewViewModel.SelectedTvShow != null;
}
在 VM 中实现 SelectedTvShow 属性:
public TvShowViewModel SelectedTvShow
{
get { return _selectedTvShow; }
set
{
_selectedTvShow = value;
OnPropertyChanged();
}
}
更新选定的电视节目:
public void TvShowsSelectionChanged()
{
Episodes.Clear();
var queryEpsidesForSelection = new QueryEpsidesForSelection(TvShows);
foreach (var episode in queryEpsidesForSelection.QueryEpisodes())
{
Episodes.Add(episode);
}
SelectedTvShow = queryEpsidesForSelection.SelectedTvShow;
MainCommandsViewModel.DownloadNewestEpisodesCommand.RaiseCanExecuteChanged();
//MainCommandsViewModel.BrowseTorrentSiteCommand.RaiseCanExecuteChanged();
}
我有意评论了我强制调用RaiseCanExecuteChanged 的最后一行,我以前从未使用过它。显然这解决了问题,但我使用了很多 RelayCommands,而且它们似乎都遇到了同样的问题:它们的 CanExecute 方法不再自动重新评估。
CanExecute 方法不再被触发的原因是什么?
【问题讨论】:
-
调用
RaiseCanExecuteChanged是你应该做的,这就是它的工作原理。除非有一些标准命令支持此类功能,否则无法自动重新评估 CanExecute。另一种方法是使用CommandManager -
@KingKing 请在下面查看我的回答。调用
RaiseCanExecuteChanged应该不需要。也许我不明白你想告诉我什么。
标签: c# wpf mvvm mvvm-light relaycommand