2013-08-27 3 views
2

Can Execute of a ICommand while a Context menu openRaise CanExcute команды контекстного меню, в то время откройте контекстного меню

С продолжением вышеупомянутого запроса, все же ее не в состоянии достичь.

Есть ли способ поднять команду CanExcute меню контекстного меню, открыв контекстное меню. Это нужно сделать в контекстном меню, и здесь я не могу получить доступ к viewmodel.

Любая идея по этому вопросу?

public static BaseCommand SaveCommand 
    { 
     get 
     { 
      if (saveCommand == null) 
       saveCommand = new BaseCommand(OnSaveCommandClicked, OnSaveCommandCanExcute); 

      return saveCommand; 
     } 
    } 

где BaseCommand получен из ICommand.

public class BaseCommand : ICommand 
{ 
    private Predicate<object> _canExecute; 
    private Action<object> _method; 
    public event EventHandler CanExecuteChanged; 

    public BaseCommand(Action<object> method) 
     : this(method, null) 
    { 
    } 

    public BaseCommand(Action<object> method, Predicate<object> canExecute) 
    { 
     _method = method; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     if (_canExecute == null) 
     { 
      return true; 
     } 

     return _canExecute(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _method.Invoke(parameter); 
    } 

} 
+1

Можете ли вы предоставить свою реализацию «ICommand» для меню? Он должен нормально работать, если вы делегируете 'CommandManager', чтобы поднять' CanExecute'. –

+0

@Mathew: Я обновил код выше, есть ли способ поднять canExcute. Это контекстное меню знает, какие предметы его собираются носить, но если элементы этого контекстного меню имеют какие-либо команды, ему необходимо поднять возможность искушения ICommand. – Sankarann

+0

Просьба показать реализацию 'ICommand', т.е. класс, который реализует этот интерфейс, который из вашего кода кажется« BaseCommand ». Покажите код, который в настоящее время вызывает событие CanExecuteChanged внутри 'BaseCommand'. –

ответ

0

Внутри BaseCommand, замените CanExecuteChanged выглядеть следующим образом. И он будет работать так, как вы этого хотите.

public event EventHandler CanExecuteChanged 
    { 
     add 
     { 
      CommandManager.RequerySuggested += value; 
     } 
     remove 
     { 
      CommandManager.RequerySuggested -= value; 
     } 
    }