WPF的ComboBox如果选择另一个值时报错则界面显示上一个值.MVVM
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF的ComboBox如果选择另一个值时报错则界面显示上一个值.MVVM相关的知识,希望对你有一定的参考价值。
xaml文件
<ComboBox ItemsSource="Binding KeyBords" SelectedValue="Binding SelectedKeyBordValue"/>
ViewModel文件
public String SelectedKeyBordValue
get return selectedKeyBordValue;
set
if (!this.SelectedKeyBordChanged(value))
return;
selectedKeyBordValue = value;
base.RaisePropertyChanged("SelectedKeyBordValue");
如果有两个值:One,Two。
最初选中时的Two。当我选择One的时候,this.SelectedKeyBordChanged(value))返回false. ViewModel里面SelectedKeyBordValue值还是One,但是界面已经是One,我想界面也是Two;
最初选中时的Two。当我选择One的时候,
this.SelectedKeyBordChanged(value))返回false.
(注意有一个叹号)
下面代码就会Return,if (!this.SelectedKeyBordChanged(value)) return;
执行完后:ViewModel里面SelectedKeyBordValue值还是Two,但是界面已经是One,我想界面也是Two;
SelectedValue="Binding SelectedKeyBordValue" 说明SelectedValue是单向绑定,后台数据发生变化前台会做出相应的变化,但前台发生变化后台数据不发生变化。如果前台发生变化,且要通知到后台。只需SelectedValue="Binding SelectedKeyBordValue, Mode=TwoWay即可追问
SelectedValue="Binding SelectedKeyBordValue" 默认方式是双向的。
最初前台和后台值都是第一个值(Two)。我的问题是:当我选择第二个值(One)的时候,前台和后台值都不改变。目前状况是后台没有改变,但是前台改变啦!
你是做了什么使得默认绑定变成了双向绑定?WPF默认是单向的!当你选择前台值的时候就说明你前台的值发生了改变。什么叫前台和后台的值不改变。。。
追问Default: binding的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay.
我建议你可以试一下,用上面的代码。试一下我想你应该就更明白啦。例子很简单。if (!this.SelectedKeyBordChanged(value))这个代码你可以顺便模拟。
this.SelectedKeyBordChanged(value))返回false。仔细看我代码。你也可以测试一下。
追答不建议在set中使用:
if (!this.SelectedKeyBordChanged(value))
return;
你可以在ComboBox 的selectionChanged event中进行检查,但是不要在赋值中进行检查,因为很可能在不同的线程中,这样做有可能会在不同的时候返回不同的值。
您说的很对,线程提醒了我。只需要在前台设置一下异步绑定就可以。
正解:将IsAsync设置为True
问题不清楚,能否细化以下几点
KeyBords是什么意思,为什么要用这个单词?
xaml里面绑定了两个对象,而你后台代码只贴出了一个,应同时贴出另外一个
ViewModel构造函数或者初始化里面有没有设置初始值?
你后面到底想问什么?没人搞得清楚。
不好意思,我没有写的那么清楚。
KeyBords只是一个字符串List集合,包括两个值One,Two。
SelectedKeyBordValue=Two。
是list还是observablecollection?
追问是list是observablecollection。您可以仔细看下我的问题补充。最后是我想问的。
追答你在说什么?
追问我选择One。执行完后:ViewModel里面SelectedKeyBordValue值还是Two,但是界面已经是One,问题是:我想界面也是Two和SelectedKeyBordValue值一样。
追答我真的看不懂你在说什么。建议你直接说你的需求,不要说你的代码了。看有无更好的实现!
追问好吧,说的简单点。
最初状态界面上有一个控件Combobox。里面有两个值Item1和Item2.Item1是选中的。
当我切换Item2的时候,出现一些错误,所以切换没有成功。
这个时候界面上Combobox选中的值应该是上一个值Item1,而不是Item2。
用MVVM实现
需求也不会描述吗?“所以切换没有成功。”这种不叫做需求!
追问呢你懂了吗?我看你不是替我解决问题的!
追答我来教你怎么说:Combobox绑定的是XX,包含值1,值2。。当界面选择的时候,我希望后台的值XX为XX。
追问好吧!Combobox绑定的集合项包含值1,值2。值1处于选中状态和后台同步。
当界面选择值2的时候,我希望前台和后台值不变。
目前状况是:前台变了,而后台没变。
既然希望不变,干嘛还要去选择?
追问好吧!再仔细点:是有错误出现的时候不变。
追答什么叫“有错误出现的时候”?推测你的意思是有的item会在某些时候由后台验证,如果不合法将撤销用户的选择操作,那么你在set里面,如果不合法,则再给这属性赋选择之前的合法值不就行了吗?你return只能保证后台的属性不变,但是不能保证前台也不变,要显示设定才会引发PropertyChanged,才会通知界面!
本回答被提问者采纳以上是关于WPF的ComboBox如果选择另一个值时报错则界面显示上一个值.MVVM的主要内容,如果未能解决你的问题,请参考以下文章