C# RelayCommand canexecute永远不会重新评估

C# RelayCommand canexecute永远不会重新评估,c#,wpf,mvvm,mvvm-light,relaycommand,C#,Wpf,Mvvm,Mvvm Light,Relaycommand,我有一个应用程序,它在MVVM体系结构中使用RelayCommands 似乎在某个时间点,CanExecute方法不再得到正确的重新评估。(可能是因为安装了VS2013的最新更新导致的?) 下面的代码似乎是最基本的,我真的希望有人能帮助我 中继命令的声明: public RelayCommand BrowseTorrentSiteCommand { get; private set; } 中继命令的实例化: BrowseTorrentSiteCommand = new RelayCommand

我有一个应用程序,它在MVVM体系结构中使用
RelayCommand
s

似乎在某个时间点,
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();
    }
我故意对我强制调用
RaiseCanceChanged
的最后一行进行了注释,我以前从未使用过该行。显然,这解决了问题,但我使用了很多RelayCommands,它们似乎都遇到了相同的问题:它们的
CanExecute
方法不再自动重新评估

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

更新 MvvmLight中有两种
RelayCommand
实现

  • 使用GalaSoft.MvvmLight.Command在
    中输入一个
  • 使用GalaSoft.MvvmLight.CommandWpf的
    中有一个
我使用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;
    }
当button1被执行时,此界面上方的UI将启用button2

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


任何帮助都将不胜感激。

呼叫
RaiseCanceTechChanged
是您应该做的,这就是它的工作原理。除非有一些标准命令支持此类功能,否则无法自动重新评估CanExecute。另一种方法是使用
CommandManager
@KingKing请看下面我的答案。不需要调用
RaiseCanceTechChanged
。也许我不明白你想告诉我什么。我不明白解决你问题的主要部分是什么。这个答案毫无意义。这可能对你有意义,但请记住,社区需要一些对他们有用的东西。您甚至可以在这里使用一些自定义库。该库可能有一些逻辑,可以自动连接并重新评估
CanExecute
(如
CommandManager
可以处理
RequerySuggested
事件)。@KingKing说真的,MvvmLight对你来说是“某种自定义库”?!我认为它在社区中的应用已经足够广泛,使用这个库来解决问题已经足够有用了…@KingKing,PS,如果你非常担心“社区”的价值,请在下次添加评论之前看看你的建议。您的评论意味着该功能根本不存在,而您显然没有使用MvvmLight的经验……请再次检查您的问题。有没有办法让别人知道你在用什么图书馆?如果你不使用任何图书馆,我的建议是正确的。甚至标签也只有MVVM。MVVM只是一种模式,即使不使用任何库,也有很多方法可以遵循这种模式,明白吗?是的,我明白,但RelayCommand不是.NET的一部分。这是问题的一部分。但好吧,你说得有道理。下一次只需询问使用了什么工具包,而不要给出暗示其他内容的模糊评论。我将添加mvvm灯光作为标记