是否有简单的方法提示用户确认组合框选择更改,如果用户选择否,则不处理更改?
我们有一个组合框,改变选择会导致数据丢失。基本上用户选择一个类型,然后他们可以输入该类型的属性。如果他们改变类型,我们清除所有的属性,因为它们可能不再适用。问题是,在选择下,你再次引发SelectionChanged
事件。
下面是一个片段:
if (e.RemovedItems.Count > 0)
{
result = MessageBox.Show("Do you wish to continue?",
"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;
}
}
我有两个解决办法,我都不喜欢。
1.用户选择**"否"**后,移除SelectionChanged
事件处理程序,更改选定项,然后再次注册SelectionChanged
事件处理程序。这意味着您必须保留类中事件处理程序的引用,以便添加和移除它。
1.创建一个ProcessSelectionChanged
布尔值作为类的一部分。总是在事件处理程序开始时检查它。在我们将选择更改回之前将它设置为false,然后将它重置为true。这将起作用,但我不喜欢使用标志来基本上使事件处理程序无效。
有人有替代的解决方案或改进我提到的吗?
6条答案
按热度按时间brgchamk1#
我发现这个很好的实现。
来源:http://www.amazedsaint.com/2008/06/wpf-combo-box-cancelling-selection.html
yks3o0rb2#
也许创建一个从
ComboBox
派生的类,并覆盖OnSelectedItemChanged
(或OnSelectionChangeCommitted
)。iklwldmw3#
在
SelectionChanged
事件处理程序中进行验证允许您在选择无效时取消逻辑,但我不知道取消事件或项选择的简单方法。我的解决方案是对WPF组合框进行子类化,并为
SelectionChanged
事件添加一个内部处理程序。无论何时触发该事件,我的私有内部处理程序都会引发一个自定义的SelectionChanging
事件。如果在对应的
SelectionChangingEventArgs
上设置了Cancel
属性,则不会引发该事件,并且SelectedIndex
将恢复为以前的值。否则,将引发一个新的SelectionChanged
,该SelectionChanged
将隐藏基本事件。希望这会有所帮助!SelectionChanging事件的EventArgs和处理程序委托:
ChangingComboBox类实现:
7qhs6swi4#
在WPF中动态设置对象
91zkwejq5#
我不认为使用调度器来发布(或延迟)属性更新是一个好的解决方案,它更多的是一个并不真正需要的解决方案。下面的解决方案完全是mvvm,它不需要调度器。
在视图代码后挂钩SelectionChanged事件,并根据VM.ConfirmChange(...)方法是否返回如下值更新源(即VM)或目标(即V):
yqhsw0fo6#
这是一个古老的问题,但经过一次又一次的问题,我想出了这个解决方案:
组合框助手.cs:
它可以在自定义UserControl中使用,如下所示:
这与
SelectionChanged
事件无关,不会因事件触发频率超过要求而产生副作用。因此其他人可以安全地侦听该事件,例如更新其UI。还应避免:将事件处理程序中的选择重置为有效项而导致的“递归”调用。以上关于
DataContext
的假设可能并不完全适合所有场景,但可以很容易地调整。一个可能的替代方案是检查ComboBox
是否是e.OriginalSource
的可视父项,当选择一个项时,它不是。