如何在UWP中切换MVVM

  • 本文关键字:MVVM UWP c# mvvm uwp
  • 更新时间 :
  • 英文 :


如何使用命令正确设置toggleswitch?我使用行为来启动使用切换事件的命令。然而,当用户更改开关的状态时,我遇到了问题,但我的模型拒绝了它。我不知道如何正确地对它进行编程,所以如果视图被模型拒绝,它就会拒绝更新。

以下是我的尝试(为了清晰起见,跳过了INotifyPropertyChanged的详细信息(:

1.单向命令

class ToggleSwitchVm {
public bool IsOn => Model.IsOn;
public ICommand SwitchManipulated {get;}
}

当用户在UI中操纵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
}
}
}
}
}

这是一个混乱,因为模型和视图都设置了IsOn属性,并且无法知道是哪一个设置的

如何在UWP 中切换MVVM

ToggleSwitchIsOnPropertyDependencyProperty,这意味着它可以用于将数据与双向模型绑定。并且您不需要处理命令中的IsOn proprty方法。请参阅以下代码以实现该功能。

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));
}

最新更新