如何取消ComboBox的SelectionChanged事件?有没有一种简单的方法可以提示用户确认组合框选择更改,如果用户选择否则不处理更改?我们有一个组合框,更改选择会导致数据丢失。用户基本上选择一种类型,然后他们可以输入该类型的属性。如果他们更改了类型,我们会清除所有属性,因为它们可能不再适用。问题是,在选择下,您再次引发SelectionChanged事件。这是一个片段:if(e.RemovedItems.Count>0){result=MessageBox.Show("Doyouwishtocontinue?","Warning",MessageBoxButton.YesNo,MessageBoxImage.Warning);if(result==MessageBoxResult.No){if(e.RemovedItems.Count>0)((ComboBox)sender).SelectedItem=e.RemovedItems[0];else((ComboBox)sender).SelectedItem=null;我有两个解决方案,我都不喜欢。用户选择否后,删除SelectionChanged事件处理程序,更改所选项目,然后重新注册SelectionChanged事件处理程序。这意味着您必须在类中保留对事件处理程序的引用,以便您可以添加和删除它。创建一个ProcessSelectionChanged布尔值作为类的一部分。始终在事件处理程序的开头检查它。在我们更改选择之前将其设置为false,然后将其重置为true。这会起作用,但我不喜欢使用标志来基本上使事件处理程序无效。有人对我提到的内容有替代解决方案或改进吗?我记得需要这样做一段时间。在我找到一个好的解决方案之前,我花了大约一周的时间进行研究和尝试。我把它贴在这里:WPF:Canceluserselectionindataboundlistbox?仅供参考,这是一个基于MV-VM的解决方案(如果您没有使用MV-VM模式,您应该使用!)我发现了这个不错的实现。私人布尔句柄选择=真;privatevoidComboBox_SelectionChanged(objectsender,SelectionChangedEventArgse){if(handleSelection){MessageBoxResultresult=MessageBox.Show("Continuechange?",MessageBoxButton.YesNo);if(result==MessageBoxResult.No){ComboBoxcombo=(ComboBox)sender;句柄选择=假;combo.SelectedItem=e.RemovedItems[0];返回;}}handleSelection=true;来源:http://www.amazedsaint.com/2008/06/wpf-combo-box-cancelling-selection.html也许创建一个从ComboBox派生的类,并覆盖OnSelectedItemChanged(或OnSelectionChangeCommitted。)在SelectionChanged事件处理程序中验证如果选择无效允许您取消逻辑,但我不知道取消事件或项目选择的简单方法。我的解决方案是子类化WPFcombobox并为SelectionChanged事件添加一个内部处理程序。每当事件触发时,我的私有内部处理程序都会引发自定义SelectionChanging事件。如果在相应的SelectionChangingEventArgs上设置了Cancel属性,则不会引发该事件,并且SelectedIndex将恢复为其先前的值。否则将引发一个新的SelectionChanged来隐藏基本事件。希望这有帮助!SelectionChanging事件的EventArgs和handler委托:放;}}publicdelegatevoidSelectionChangingEventHandler(Objectsender,SelectionChangingEventArgse);ChangingComboBox类的实现:publicclassChangingComboBox:ComboBox{privateint_index;私人诠释_lastIndex;私人布尔_suppress;公共事件SelectionChangingEventHandlerSelectionChanging;公共新事件SelectionChangedEventHandlerSelectionChanged;publicChangingComboBox(){_index=-1;_lastIndex=0;_suppress=假;base.SelectionChanged+=InternalSelectionChanged;}privatevoidInternalSelectionChanged(Objects,SelectionChangedEventArgse){varargs=newSelectionChangingEventArgs();OnSelectionChanging(参数);如果(args.Cancel){返回;}OnSelectionChanged(e);}publicnewvoidOnSelectionChanged(SelectionChangedEventArgse){if(_suppress)返回;//选择已经改变,so_index必须更新_index=SelectedIndex;如果(SelectionChanged!=null){SelectionChanged(this,e);}}publicvoidOnSelectionChanging(SelectionChangingEventArgse){if(_suppress)返回;//调用dex提升SelectionChang=(_index>=0)之前的最后一个SelectedIndex?_index:选定索引;如果(SelectionChanging==null)返回;//如果用户取消更改,则调用用户事件处理程序并恢复到最后//选择的索引SelectionChanging(this,e);如果(e.Cancel){_suppress=true;SelectedIndex=_lastIndex;_suppress=假;我不相信使用调度程序来发布(或延迟)属性更新是一个很好的解决方案,它更像是一个不需要的解决方法以下解决方案我完全是mvvm,它不需要调度程序。在挂接到SelectionChanged事件的视图代码中,根据VM.ConfirmChange(…)方法是否有返回值更新Source(即VM)或Target(即V),如下:privatevoidComboBox_SelectionChanged(objectsender,SelectionChangedEventArgse){if(e.AddedItems.Count!=0){varselectedItem=e.AddedItems[0];如果(e.AddedItems[0]!=_ViewModel.SelectedFormatType){varcomboBoxSelectedItemBinder=_TypesComboBox.GetBindingExpression(Selector.SelectedItemProperty);//_TypesComboBox是ComboBox控件的名称if(_ViewModel.ConfirmChange(selectedItem)){//如果用户确认更改则更新VM.SelectedItem属性.comboBoxSelectedItemBinder.UpdateSource();}else{//否则根据VM.SelectedItem属性更新视图comboBoxSelectedItemBinder.UpdateTarget();}}}}WPF中动态设置对象以上是C#学习教程:如何取消ComboBox的SelectionChanged事件?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——if(sender.IsMouseCaptured){//执行操作}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
