【发布时间】:2020-07-28 05:30:08
【问题描述】:
如何使用命令正确设置切换开关?我正在使用行为来使用 Toggled 事件启动命令。但是,当用户更改开关状态时我遇到了问题,但我的模型拒绝了它。我不知道如何正确编程,所以如果模型拒绝,视图会拒绝更新。
这是我的尝试(为清楚起见,跳过了 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
}
}
}
}
}
这是一团糟,因为 Model 和 View 都设置了 IsOn 属性,无法知道是哪一个设置的。
【问题讨论】:
-
快速浏览一下这个控件是什么,
bool属性是这样的。 “Model 和 View 都设置了 IsOn 属性并且无法知道哪个设置了它” 值得作为单独问题提出的问题,您需要显示有关它的详细信息。对于一个控件,谁来设置它并不重要:用户通过点击或虚拟机通过设置属性。 -
所以您正在尝试制作一个可以绑定命令的自定义切换开关,对吧?
-
我正在使用这种行为来添加命令:pastebin.com/xYvsbg3e