如何从SelectionChanged事件中停止ComboBox SelectionChange

时间:2010-09-15 08:59:34

标签: wpf wpf-controls

我有一个与List结合的ComboBox。考虑我在列表中有10个项目,所以在组合框中也是如此。

目前在ComboBox中选择了第二个项目。

现在我在ComboBox中选择第3项。

在Combobox SelectionChanged事件中,我正在进行一些验证并且验证失败,因此我不希望我的选择从第2项更改为第3项或选择应保留在第2项。

请告诉我怎么做?

在ComboBox SelectionChanged事件中,我尝试设置ComboBox.SelectedItem = 2ndItem。

但这不能正常运作。

希望,我的要求很明确。如果您有任何疑问,请随时问我。

的问候,

VIMAL

1 个答案:

答案 0 :(得分:1)

禁用该项目,以便用户看到它们当前不是一个选项(也无法选择)。您可以在ComboBoxItem上设置IsEnabled属性。

如果您使用MVVM,请将IsEnabled属性添加到ViewModel并将其绑定到容器的IsEnabled属性(ItemContainerStyle)。

然而,IMO的最佳选择是,不要显示不可选择的项目。

<强>更新

正如评论中所承诺的那样,Dispatcher-Code设置的SelectedItem被延迟:

Dispatcher.BeginInvoke(new Action(delegate {  
    yourComboBox.SelectedItem=yourOldItem;       
    }), System.Windows.Threading.DispatcherPriority.ContextIdle, null); 

我认为这会有所帮助,但不是很好。如果您有可能禁用或隐藏项目,这将更好。顺便说一句,我把ContextIdle用于调度程序优先级。这是一个非常强大的价值。您可以围绕哪个值来满足您的需求。

<强> CoerceValueCallback

另一种可能性是从Combobox派生,更改SelectedItem的元数据并向其添加CoerceValueCallback。在那里,您可以重置该值。