Как правильно настроить тумблер с помощью команды? Я использую поведение для запуска команды с помощью события Toggled. Однако у меня есть проблема, когда пользователь изменил состояние переключателя, но моя модель отклоняет его. Я не знаю, как правильно его запрограммировать, поэтому просмотр отклоняет обновление, если оно было отклонено моделью.
Вот мои попытки сделать это (детали INotifyPropertyChanged пропущены для ясности):
1. Односторонняя команда
class ToggleSwitchVm {
public bool IsOn => Model.IsOn;
public ICommand SwitchManipulated {get;}
}
Когда пользователь манипулирует состоянием ToggleSwitch в пользовательском интерфейсе, но оно не связано с состоянием в модели. Также toggleswitch игнорирует события PropertyChanged при вызове команды:
async void SwitchManipulatedCommand(bool? state) {
if(!Model.SetNewState(state.Value)) { // if failed to set state raise PropertyChanged to refresh view
RaisePropertyChanged(nameof(IsOn)); // this call is ignored :(
}
}
2. Двухстороннее свойство?
class ToggleSwitchVm {
private void ModelOnPropertyChanged(object sender, PropertyChangedArgs args){
if(args.PropertyName == nameof(Model.IsOn)){
IsOn = Model.IsOn;
}
}
private bool _isOn;
public bool IsOn
{
get => _isOn;
set {
if(SetValue(ref _isOn, value))
{ // true if model was manipulated
// View set value, or model set value?
if(!Model.SetState(value))
{
RaisePropertyChanged(nameof(IsON)); // ignored by view
}
}
}
}
}
Это беспорядок, потому что и Model, и View устанавливают свойство IsOn, и нет способа узнать, какое из них его установило.