RelayCommand canexecute永远不会被重新评估

时间:2014-11-02 12:04:43

标签: c# wpf mvvm mvvm-light relaycommand

我有一个应用程序,它在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方法不再被触发的原因是什么?

1 个答案:

答案 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。

但是,这个基本行为似乎不适用于我的其他应用......

非常感谢任何帮助。