我有一个应用程序,它在MVVM架构中使用RelayCommand
。
似乎在某个时间点,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
方法不再被触发的原因是什么?
答案 0 :(得分:1)
MvvmLight中有两个RelayCommand
实现。
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.CommandWpf;
我将命名空间更改为using GalaSoft.MvvmLight.CommandWpf;
,一切都像以前一样工作......
在RelayCommand
此实施的评论中,以下评论将其删除:
// Remarks:
// If you are using this class in WPF4.5 or above, you need to use the GalaSoft.MvvmLight.CommandWpf
// namespace (instead of GalaSoft.MvvmLight.Command). This will enable (or
// restore) the CommandManager class which handles automatic enabling/disabling
// of controls based on the CanExecute delegate.
无论如何,问题解决了......(花了我足够长的时间......)
@KingKong,
也许我认为你的评论是错误的,但是在我刚刚创建的示例应用程序中,这可以很好地检查我的理智。
public MainViewModel()
{
Command1 = new RelayCommand(OnCommand1Executed, () => true);
Command2 = new RelayCommand(OnCommand2Executed, OnCommand2CanExecute);
}
private void OnCommand1Executed()
{
_command2CanExecute = true;
}
private void OnCommand2Executed()
{
// Not implemented
}
private bool OnCommand2CanExecute()
{
return _command2CanExecute;
}
当执行button1时,此处的UI将启用button2。
但是,这个基本行为似乎不适用于我的其他应用......
非常感谢任何帮助。