2015-05-02 2 views
1

У меня есть абсолютно no Идея, что вызывает это.RaiseCanExecuteChanged не работает в скомпилированном exe Но работает ли при отладке

фона: Использование Prism Framework

  1. Я кнопка привязана к DelegateCommand
  2. я называю RaiseCanExecuteChanged

Когда я запустить приложение в режиме отладки в Визуальная Studio, все работает отлично. Приложение работает отлично.

Когда я открываю приложение через .exe, метод RaiseCanExecuteChanged не вызывается. Я понятия не имею, почему это так. Кто-нибудь еще сталкивается с подобной проблемой?


EDIT: Когда я первый открыть приложение через EXE, RaiseCanExecuteChanged называется (так как я поставил его в конструкторе моего ViewModel). Однако он никогда не называется снова.


код в случае его необходимости:

private readonly DelegateCommand _buttonCommand; 

public ViewModel() 
{ 
    _buttonCommand = new DelegateCommand(Button, CanExecuteButton); 
} 

public DelegateCommand ButtonCommand 
{ 
    get { return this._buttonCommand; } 
} 

public void Button() 
{ 
    ... do stuff ... 
    _buttonCommand.RaiseCanExecuteChanged(); 
} 

public bool CanExecuteButton() 
{ 
    if (some condition) 
     return true; 
    else 
     return false; 
} 

<Button x:Name="MyButton" Content="ClickMe" 
     Command="{Binding ButtonCommand}"> 

Я даже получил отчаянный и попытался положить IsEnabled свойство в моем Баттона, который я связан с CanExecuteButton ... безрезультатно.

+0

Вы можете разместить код вашего 'ButtonCommand'? –

+0

Решенный, но я не знаю почему. Сейчас это работает ... – Bryant

ответ

0

У меня возникли аналогичные проблемы с событием Prism DelegateCommand.CanExeuteChanged, которое не вызывается. Изучая исходный код, похоже, что это связано с тем, что он не полагается на CommandManager.RequerySuggested.

Попробуйте сделать свою собственную команду, где это событие CanExecuteChanged, как так:

public RelayCommand : ICommand 
{ 
    private event EventHandler _canExecuteChanged; 
    public event EventHandler CanExecuteChanged 
    { 
     add 
     { 
      CommandManager.RequerySuggested += value; 
      _canExecuteChanged += value; 
     } 
     remove 
     { 
      CommandManager.RequerySuggested -= value; 
      _canExecuteChanged -= value; 
     } 
    } 

    public void RaiseCanExecuteChanged() 
    { 
     var handler = _canExecuteChanged; 
     if (handler != null) 
      handler(this, EventArgs.Empty); 

    } 

    // All the other stuff also 
} 

Теперь, если WPF обнаруживает изменения в пользовательском интерфейсе, то CommandManager будет вызывать CanExecute по команде. И если что-то в engineroom приложения изменится, то вы можете вызвать RaiseCanExecuteChanged для обновления CanExecute.

+0

Это, похоже, не помогло. – Bryant

0

попробовать

Command="{Binding DataContext.ButtonCommand,RelativeSource={RelativeSource FindAncestor, AncestorType=YourView}}" CommandParameter="{Binding}" 
Смежные вопросы