2014-10-21 2 views
0

У меня есть приложение wpf mvvm. В представлении есть кнопка, и она привязана к команде в модели представления. Функция CanExecute этой команды возвращает значение некоторого BOOL собственностиWpf UI не обновляет

private bool Command1CanExecute() 
{ 
    return IsConnected; 
} 

Когда свойство изменяется, кнопка должна стать инвалидом, но это не произошло, пока я не нажмёте где-то в пользовательском интерфейсе. Решение, которое я думал о (и это работает :)), чтобы запустить

CommandManager.InvalidateRequerySuggested(); 

каждый второй (грузоотправитель таймер может это сделать).

Есть ли еще более элегантное решение для моей проблемы? Спасибо.

Матвей.

+0

ли вы что INotifyPropertyChanged на классе команд? (Или независимо от того, что эквивалентно для «CanExecute» в Commands ... Я слишком новичок в WPF, чтобы точно знать, что я имею в виду :)) –

+0

Чтение документов, похоже, вы должны реализовать метод " CanExecute "(а не« Command1CanExecute »), а также событие« CanExecuteChanged ». –

+0

@PeterDuniho В коде, который был опубликован op, нет ничего плохого. CanExecute берет предикат, и реализация здесь как ожидалось. – Krishna

ответ

1

Все команды обновляются после любого пользовательского взаимодействия. Если изменить свойство программно и хотят обновить команду состояний, вы должны предложить перезапрос после вашей собственности изменилась:

CommandManager.InvalidateRequerySuggested(); 

вы также можете поднять CanExecuteChanged-событие вашей команды (которая просто ничего не делает чем выше)

Command1.RaiseCanExecuteChanged(); 

вы бы вставить все это в сеттер IsConnected как следующий

private bool _isConnected; 
public bool IsConnected 
{ 
    get { return _isConnected; } 
    set 
    { 
    if (_isConnected != value) 
    { 
     _isConnected = value; 
     RaisePropertyChanged(); //or something similar 
     Command1.RaiseCanExecuteChanged(); 
    } 
    } 
} 

, если вы не хотите этого, вы можете просто вернуть true в свой CanExecute-Handler и связать IsEnabled вашей кнопки с самой собственностью.

<Button IsEnabled="{Binding IsConnected}" Command="{Binding Command1}" ... /> 
+0

Исправлено, за исключением того, что в зависимости от используемой реализации 'ICommand' не может быть метода' RaiseCanExecuteChanged() '. 'CommandManager.InvalidateRequerySposed()' - это правильный способ сделать это в WPF. –

+0

Вы правы, это зависит от используемой рамки mvvm. Хотя его реализация могла бы просто вызвать сам CommandManager. – Herm

+0

@ThomasLevesque: извините за то, что я запутался в моем запутанном «я», но ... почему отсутствие метода RaiseCanExecuteChanged() обязательно приведет к вызову метода CommandManager? В ICommand есть событие CanExecuteChanged ... почему бы разработчику не продвинуться вперед и не поднять это событие? –

0

Для тех, кто использует MicroMvvm изменение должно быть применено к классу: public class RelayCommand<T>:ICommand

и метод:

[DebuggerStepThrough] 
     public Boolean CanExecute(Object parameter) 
     { 

      var valu = _canExecute == null ? true : _canExecute(); 
      CommandManager.InvalidateRequerySuggested(); 
      return valu; 
     } 
Смежные вопросы