C#学习教程:使用MVVM重置组合框中的组合框选定项我想在ComboBox中显示一个字符串列表。XAML:视图模型:publicCollectionItemsCollection;//假设这有10个值。私有字符串_selectedItem;publicstringSelectedItem{get{return_selectedItem;}设置{_selectedItem=值;触发属性更改通知。现在这段代码工作得很好。我可以从View中选择,我可以在ViewModel中更改,如果我从ViewModel更改SelectedItem,我可以在我的View中看到它。现在这就是我想要实现的目标。当我从我的视图中更改所选项目时,我需要检查该值是好是坏(或其他)设置所选项目,否则不要设置它。所以我的视图模型像这样改变。publicstringSelectedItem{get{return_selectedItem;}set{if(SomeCondition(value))_selectedItem=value;//更新选择的项目。否则_selectedItem=_selectedItem;//不更新所选项目。触发器通知已更改。ofproperty}现在,当我执行此代码并且SomeCondition(value)返回false时,SelectedItem返回旧字符串值,但在我看来,ComboBox中的所选项目是我选择的值。所以我假设我的ComboBox中有10个字符串的集合。除了第2和第4个元素外,所有值都很好(SomeCondition对于第2和第4个值返回false)。我想要的是,如果我选择第二个或第四个元素,selectedItem不会改变。但是我的代码没有正确地做到这一点。如果我选择第二个元素,视图仍将第二个元素显示为已选中。我知道我的代码有问题。但它是什么?这是一个非常有趣的问题。首先,我同意其他人的看法,这是一种不推荐使用的处理无效选择的方式。正如@blindmeis所说,IDataErrorInfo是解决它的好方法之一。回到问题本身。满足@FaisalHafeez想要的解决方案是:publicstringSelectedItem{get{return_selectedItem;}设置{varoldItem=_selectedItem;_selectedItem=值;OnPropertyChanged("SelectedItem")if(!SomeCondition(value))//如果不满足条件,将项目设置回旧项目Dispatcher.CurrentDispatcher.BeginInvoke(newAction(()=>SelectedItem=oldItem),DispatcherPriority.ApplicationIdle);Dispatcher是一种优雅的方式,可以在另一个UI同步过程中处理一些UI同步。例如,在这种情况下,您希望在选择绑定期间重置选择。这里的一个问题是为什么我们必须首先更新选择。那是因为SelectedItem和SelectedValue是分开赋值的,ComboBox上的显示不依赖于SelectedItem(可能是SelectedValue,我这里不确定)。还有一点比较有意思的是,如果SelectedValue发生变化,SelectedItem一定会发生变化,但是SelectedValue发生变化时并不会更新SelectedValue。因此,您可以选择绑定到SelectedValue,这样您就不必先进行分配。TrychangingtheXAMLinyourVMtothis上面是C#LearningTutorial:UsingMVVMtoresetthecomboboxselectediteminacombobox所有内容分享,如果对你有用需要进一步了解C#LearningTutorial,希望请注意—{set{currSelection=-1;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
