2012-01-31 41 views
0

我想禁用一個按鈕,而其命令正在處理。WPF。 RelayCommand - CanExecute false,而執行正在處理

public ICommand Search { get; set; } 

    private void InitilizeSearchCommand() 
    { 
     Search = new RelayCommand<string>(
      param => DoSearch(param), 
      param => !_isSearchInProgress); 
    } 

如何修改_isSearchInProgress?我不能這樣做,裏面的「執行」的代表,因爲它從一個地方(RelayCommand對象)執行,其中場是無法訪問的(如果我的理解是真實的):

Search = new RelayCommand<string>(
      param => 
       { 
        _isSearchInProgress = true; 
        DoSearch(param); 
        _isSearchInProgress = false; 
       }, 
      param => !_isSearchInProgress); 

預先感謝任何幫助。

回答

1

的解決方案來解決該問題:

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

CommandManager.InvalidateRequerySuggested(); 

應該被添加到CanExecute方法,而不是在執行。 _isSearchInProgress在獨立線程(在我的情況下爲backgroundWorker.RunWorkerAsync)中運行的DoSearch()內部更新。

0

除非您在後臺線程或任務中運行,否則GUI將不會從CanExecute部件請求更新。如果你在後臺做東西,只要確保_isSearchInProgress不是在任何函數中創建的,而是在類中的一部分。

+0

喬爾,你能告訴更多關於這個嗎?如果我爲DoSearch()使用單獨的線程並在內部包含_isSearchInProgres方法,那麼它工作良好,但只是第一次。稍後我應該點擊UI來更新它。 – 2012-02-01 14:44:37

+0

您是否對包含_isSearchInProgress的類使用INotifyPropertyChanged,因此,是_isSearchInProgress的一個公共屬性,並且當它發生更改時觸發PropertyChanged? – 2012-02-01 16:47:38

+0

_isSearchInProgress是一個私人領域,它不綁定到UI,這就是爲什麼INotifyPropertyChanged不會幫助我。這是一個很大的謎題,它爲什麼不能在主線程中工作,並且部分在單獨工作。 – 2012-02-02 09:09:49

相關問題