2015-05-05 3 views
0

Я хотел бы назвать ApplicationCommand с MenuItem-Click:CanExecute из ApplicationCommand не обновляет

 <MenuItem Header="{StaticResource MenuItemSave}" Command="ApplicationCommands.Save"/> 

В моей ViewModel-Конструктора я inizialize мои привязок с:

CommandBinding saveBinding = new CommandBinding(ApplicationCommands.Save, SaveCommand_Execute, SaveCommand_CanExecute); 
    CommandManager.RegisterClassCommandBinding(typeof(ViewModel_Main), saveBinding); 
    RegisterCommandBindings.Add(saveBinding); 

Сейчас я бы как обрабатывать команду, но она просто не выполнима. Даже если это должно быть ВСЕГДА верно.

private void SaveCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = true; 
} 
private void SaveCommand_Execute(object sender, ExecutedRoutedEventArgs e) 
{ 
    //Stuff 
} 

Я также пытался обновить все привязки после моей функции инициализации:

CommandManager.InvalidateRequerySuggested(); 

Но мой MenuItem остается инвалидом.

Спасибо!

ответ

0

Я предложил бы использовать эту реализацию ICommand

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Input; 

namespace Common 
{ 
    public class Command<TArgs> : ICommand 
    { 
     public Command(Action<TArgs> exDelegate) 
     { 
      _exDelegate = exDelegate; 
     } 

     public Command(Action<TArgs> exDelegate, Func<TArgs, bool> canDelegate) 
     { 
      _exDelegate = exDelegate; 
      _canDelegate = canDelegate; 
     } 

     protected Action<TArgs> _exDelegate; 
     protected Func<TArgs, bool> _canDelegate; 

     #region ICommand Members 

     public bool CanExecute(TArgs parameter) 
     { 
      if (_canDelegate == null) 
       return true; 

      return _canDelegate(parameter); 
     } 

     public void Execute(TArgs parameter) 
     { 
      if (_exDelegate != null) 
      { 
       _exDelegate(parameter); 
      } 
     } 

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

     bool ICommand.CanExecute(object parameter) 
     { 
      if (parameter != null) 
      { 
       var parameterType = parameter.GetType(); 
       if (parameterType.FullName.Equals("MS.Internal.NamedObject")) 
        return false; 
      } 

      return CanExecute((TArgs)parameter); 
     } 

     void ICommand.Execute(object parameter) 
     { 
      Execute((TArgs)parameter); 
     } 

     #endregion 
    } 
} 
+0

Я думаю, что это та же реализация, как в рамках света MVVM. Спасибо! – MisterPresident

Смежные вопросы