2015-05-29 2 views
0

Я все еще изучаю mvvm и кодирую с c#, но я застрял в проблеме, о которой я не знаю, как ее обойти. Мой проект, кажется, не признаютRaiseCanExecuteChanged не распознается даже с правой директивой

RaiseCanExecuteChanged 

даже когда я использую

System.Windows.Input; 

я использую MVVM Light и в NET4.5

Погрешность я получаю это

`System.Windows.Input.ICommand` does not contain a definition for '`RaiseCanExecuteChanged`' and no extension method '`RaiseCanExecuteChanged`' accepting a first argument of type 'System.Windows.Input.Icommand' could be found(are you missing a using directive or an assembly reference?) 

Кто-нибудь сталкивался с этим вопросом раньше? Спасибо за вашу помощь

Вот код, я использую в ViewModel, чтобы создать команду

public class NetworkingViewModel : ViewModelBase, INotifyPropertyChanged 
{ 

public NetworkingViewModel() 
    { 
     AddPersonCommand = new RelayCommand(AddPerson,CanAddName); 
    } 

public ICommand AddPersonCommand {get; private set;} 

private void AddPerson() 
    { 
     *adds person to an observableCollection* 
    } 
private bool CanAddName() 
    { 
     return !string.IsNullOrEmpty(Group); 
    } 

public string Group // the Name property 
    { 
     get { return _group; } 
     set 
     { 
      if(value !=_group) 
      { 
       _group = value; 
       RaisePropertyChanged("Group"); 
       AddPersonCommand.RaiseCanExecuteChanged(); 
      } 
     } 
    } 
} 
+1

RaiseCanExecuteChanged не существует на интерфейсе ICommand. Можете ли вы опубликовать пример того, где вы создаете команду? – Bijington

ответ

0

просто определить вашу команду как свойство команды реле:

общественного ICommand AddPersonCommand {получить; частный набор;}

public RelayCommand AddPersonCommand {get; private set;} 
+0

Это работает, однако, если это конкретная деталь реализации в этом классе (и, похоже, это так, поскольку сеттер является закрытым), я бы не стал модифицировать общедоступное определение класса для этого и просто бросил его во внутреннюю использование – Jcl

+0

У вас может быть поле поддержки типа RelayCommand и свойство типа ICommand, но придите, будьте прагматичным разработчиком! В чем преимущество скрытия команды реле в этом случае? – Liero

+0

Я предполагаю, что была причина (фактическая или будущая) для нее как публичной, так и типа «ICommand» вместо «RelayCommand». Завтра вы можете изменить свои данные о реализации другим разработчикам «ICommand», и это не сломает все, что использует это публичное свойство. Конечно, может получиться, что это новая библиотека, которую никто не использует, и она всегда будет использоваться с WPF 'RelayCommand' ... но, приложив усилия к нулю для обоих вариантов, мне всегда нравится играть на безопасной стороне ... личный выбор Я думаю :-) – Jcl

1

ICommand не RaiseCanExecuteChanged, однако RelayCommand (который вы используете) делает ... так что вы могли бы попробовать бросок или что-то:

var myCommand = AddPersonCommand as RelayCommand; 
if(myCommand != null) 
    myCommand.RaiseCanExecuteChanged(); 
0

Если вы используете MVVM Light вы, вероятно, следует использовать RelayCommands вместо ICommands и RaiseCanExecuteChanged MVVM Лайта. Это находится в пространстве имен GalaSoft.MvvmLight.Command (или, возможно, в пространстве имен GalaSoft.MvvmLight.CommandWpf - http://blog.galasoft.ch/posts/2015/01/re-enabling-the-commandmanager-feature-with-relaycommand-in-mvvm-light-v5). Ссылка, которая вместо System.Windows.Input.

См: http://www.mvvmlight.net/help/NET45/html/404e779f-7c2b-875f-bf17-b8ad84bfb7ef.htm

0

Как @Bijington сказал в комментарии, RaiseCanExecuteChanged не существует в ICommand. ICommand имеет метод CanExecute, он должен работать. Или вы можете включить AddPersonCommand в RelayCommand внутри набора свойств группы или использовать RelayCommand из нищеты в качестве типа свойства AddPersonCommand.

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