Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF。RelayCommand-CanExecute false,而Execute正在处理_Wpf_Relaycommand - Fatal编程技术网

WPF。RelayCommand-CanExecute false,而Execute正在处理

WPF。RelayCommand-CanExecute false,而Execute正在处理,wpf,relaycommand,Wpf,Relaycommand,我想禁用一个按钮,而它的命令正在处理 public ICommand Search { get; set; } private void InitilizeSearchCommand() { Search = new RelayCommand<string>( param => DoSearch(param), param => !_isSearchInProgress);

我想禁用一个按钮,而它的命令正在处理

    public ICommand Search { get; set; }

    private void InitilizeSearchCommand()
    {
        Search = new RelayCommand<string>(
            param => DoSearch(param), 
            param => !_isSearchInProgress);
    }
public ICommand Search{get;set;}
私有void InitilizeSearchCommand()
{
搜索=新的RelayCommand(
参数=>DoSearch(参数),
参数=>!\u isSearchInProgress);
}
如何修改搜索进度?我无法在“Execute”委托中执行,因为它是从字段不可访问的位置(RelayCommand对象)执行的(如果我的理解是正确的):

Search=newrelaycommand(
参数=>
{
_isSearchInProgress=true;
DoSearch(param);
_isSearchInProgress=false;
},
参数=>!\u isSearchInProgress);

提前感谢您的帮助

除非您在后台线程或任务中运行,否则GUI不会要求CanExecute部分进行更新。如果您在后台执行任务,只需确保“IsSearchProgress”不是在any函数中创建的,而是类的一部分。

解决问题的解决方案:

Search = new RelayCommand<string>(
            backgroundWorker.RunWorkerAsync,
            param =>
                {
                    CommandManager.InvalidateRequerySuggested();
                    return !_isSearchInProgress;
                });

应添加到CanExecute方法中,而不是在Execute中_isSearchInProgress在DoSearch()内更新,DoSearch()在单独的线程中运行(在我的例子中是backgroundWorker.RunWorkerAsync)

乔尔,你能告诉我更多吗?如果我对DoSearch()使用单独的线程,并在方法中包含_IsSearchProgres,它会很好地工作,但只是第一次。稍后,我应该单击UI来更新它。您是否对包含_isSearchInProgress的类使用INotifyPropertyChanged,因此,_isSearchInProgress是否为公共属性,并且在它更改时是否触发PropertyChanged?_isSearchInProgress是私有字段,并且未绑定到UI,这就是为什么INotifyPropertyChanged对我没有帮助。这是一个大问题,为什么它在主线程中根本不工作,而在单独的线程中部分工作。
Search = new RelayCommand<string>(
            backgroundWorker.RunWorkerAsync,
            param =>
                {
                    CommandManager.InvalidateRequerySuggested();
                    return !_isSearchInProgress;
                });
CommandManager.InvalidateRequerySuggested();