Как переключить MVVM в UWP - PullRequest
       0

Как переключить MVVM в UWP

0 голосов
/ 15 апреля 2020

Как правильно настроить тумблер с помощью команды? Я использую поведение для запуска команды с помощью события 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, и нет способа узнать, какое из них его установило.

1 Ответ

1 голос
/ 16 апреля 2020

Как переключить MVVM в UWP

ToggleSwitch IsOnProperty равен DependencyProperty, что означает, что его можно использовать для связывания данных с двухсторонней моделью. И вам не нужно обрабатывать свойство IsOn в командном методе. Пожалуйста, используйте следующий код для реализации этой функции.

Код Xaml

<Page.DataContext>
    <local:ViewModel />
</Page.DataContext>

<Grid>
    <ToggleSwitch
        Header="Toggle work"
        IsOn="{Binding IsOn, Mode=TwoWay}"
        OffContent="Do work"
        OnContent="Working"
        />
</Grid>

Код позади

public class ViewModel: INotifyPropertyChanged
{
    private bool _isOn;
    public bool IsOn
    {
        get { return _isOn; }
        set { Set(ref _isOn, value); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
    {
        if (Equals(storage, value))
        {
            return;
        }

        storage = value;
        OnPropertyChanged(propertyName);
    }

    private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...