gpt4 book ai didi

c# - RelayCommand canexecute 永远不会被重新评估

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:06 26 4
gpt4 key购买 nike

我有一个应用程序,它在 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 的最后一行,我以前从来没有使用过它。显然这解决了问题,但我使用了很多 RelayCommand,它们似乎都遇到了同样的问题:它们的 CanExecute 方法不再自动重新计算。

CanExecute 方法不再被触发的原因是什么?

最佳答案

更新

RelayCommand 在 MvvmLight 中有两种实现。

  • 一个在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.

无论如何,问题解决了......(我花了足够长的时间......)

原答案

@金刚,

也许我对您的评论的理解有误,但这在我刚刚创建的示例应用程序中运行良好以检查我的理智。

    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;
}

在此之上的 UI 将在执行 button1 时启用 button2。

不过,这个基本行为似乎在我的其他应用程序中不起作用......

如有任何帮助,我们将不胜感激。

关于c# - RelayCommand canexecute 永远不会被重新评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26699084/

26 4 0