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;

你的描述我不是很看得懂。但你如果在界面发生Combobox选项变化的时候,后台的this.SelectedKeyBordChanged(value))的确返回的应该是false。因为你在xaml里
SelectedValue="Binding SelectedKeyBordValue" 说明SelectedValue是单向绑定,后台数据发生变化前台会做出相应的变化,但前台发生变化后台数据不发生变化。如果前台发生变化,且要通知到后台。只需SelectedValue="Binding SelectedKeyBordValue, Mode=TwoWay即可追问

SelectedValue="Binding SelectedKeyBordValue" 默认方式是双向的。

最初前台和后台值都是第一个值(Two)。我的问题是:当我选择第二个值(One)的时候,前台和后台值都不改变。目前状况是后台没有改变,但是前台改变啦!

追答

你是做了什么使得默认绑定变成了双向绑定?WPF默认是单向的!当你选择前台值的时候就说明你前台的值发生了改变。什么叫前台和后台的值不改变。。。

追问

Default: binding的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay.

我建议你可以试一下,用上面的代码。试一下我想你应该就更明白啦。例子很简单。if (!this.SelectedKeyBordChanged(value))这个代码你可以顺便模拟。

参考技术A MVVM基本上就是你选择了什么,相关的值也是什么,所以当然如果你选择One时,界面和SelectedKeyBordValue都是One了。追问

this.SelectedKeyBordChanged(value))返回false。仔细看我代码。你也可以测试一下。

追答

不建议在set中使用:
if (!this.SelectedKeyBordChanged(value))

return;

你可以在ComboBox 的selectionChanged event中进行检查,但是不要在赋值中进行检查,因为很可能在不同的线程中,这样做有可能会在不同的时候返回不同的值。

追问

您说的很对,线程提醒了我。只需要在前台设置一下异步绑定就可以。
正解:将IsAsync设置为True

参考技术B

问题不清楚,能否细化以下几点

    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的主要内容,如果未能解决你的问题,请参考以下文章

wpf combobox 关闭窗口后,再次调用不显示已经选择的值?

WPF combobox selectedItem的问题

WPF Combobox数据绑定Binding

禁止/阻止选择 wpf 中禁用的组合框项目

WPF中,ComboBox值显示问题

Jquery 结合 easyUI 实现 当选择框中的值等于某一个值的时候,另一个combobox中的值发生变化。