CanExecute и CanExecuteChanged, я должен реализовать их с RelayCommand?
Я использую MVVM-Light, и у меня есть моя команда реле работает отлично, я только что прочитал, что я должен реализовывать CanExecuteChanged
и CanExecute
. Хотя я не могу найти хороший пример.
у кого-нибудь есть хороший пример, как реализовать это.
CanExecute должен вернуть False, когда он не может быть выполнен, но не просто отменить кнопку ??
когда я выполняю CanExecuteChanged
?
у кого-нибудь есть хорошие примеры, когда использовать каждый из них, мой код работает без но этот блог post заявляет, что я должен реализовать эти пункты.
Я немного смущен, так как я сказал, что думал, что просто свяжу Enabled
свойство или что-то к свойству в ViewModel, чтобы я мог отключить кнопку или аналогичный элемент управления?
любая помощь в понимании была бы очень благодарна.
редактировать
это то, что у меня есть сейчас... Его работа, но кнопка физически не отключен, только commmand не запускается, поскольку я возвращаю false. Я вызываю CanExecuteMe в конструкторе, чтобы заставить RaiseCanExecuteChanged работать ...
это работает в моем construtor моей viewmodel
this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);
CanExecuteMe = false;
и вот остальная часть моего кода, я взял его из примера.
private bool _canIncrement = true;
public bool CanExecuteMe
{
get
{
return _canIncrement;
}
set
{
if (_canIncrement == value)
{
return;
}
_canIncrement = value;
// Update bindings, no broadcast
//RaisePropertyChanged(CanIncrementPropertyName);
Page2Command.RaiseCanExecuteChanged();
}
}
public RelayCommand Page2Command
{
get;
private set;
}
private object GoToPage2()
{
System.Windows.MessageBox.Show("Navigate to Page 2!");
return null;
}
и вот мой XAML
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
2 ответов
CanExecute вызывается, когда кнопка должна определить, должна ли она быть включена или нет.
кнопка делает это при привязке, и после каждого запуска CanExecuteChanged (кнопка слушает это событие для своей команды).
Итак, если кнопка должна быть отключена, вы должны запустить CanExecuteChanged и, когда кнопка вызывает CanExecute, вы должны вернуть false
. Это предпочтительный метод включения / выключения кнопки при использовании команды фурнитура.
привязки команд позволяют инкапсулировать всю логику кнопок в экземпляре (команда). Метод CanExecute должен запросить текущее состояние приложения, чтобы определить, должна ли кнопка быть включена или отключена. С помощью этой инкапсуляции вы уменьшаете код спагетти в своей модели представления, где эти проверки выполняются здесь, там и там, и я забыл об этом там.
вы должны быть очень осторожны, используя предикат CanExecute. Он проверяет каждое изменение пользовательского интерфейса и для каждой клавиши клавиатуры, введенной в любое поле.
Это может вызвать проблемы с производительностью!