【问题标题】:How to stop ComboBox SelectionChange from SelectionChanged Event如何从 SelectionChanged 事件中停止 ComboBox SelectionChange
【发布时间】:2010-09-15 08:59:34
【问题描述】:

我有一个与列表绑定的组合框。考虑我在列表中有 10 个项目,所以在组合框中也有。

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

现在我正在选择 ComboBox 中的第三项。

在 Combobox SelectionChanged 事件中,我正在进行一些验证,但验证失败,所以我不希望我的选择从第二项更改为第三项,或者选择应保留在第二项中。

请告诉我该怎么做?

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

但这并不能正常工作。

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

问候,

维马尔

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

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

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

    不过,IMO 的最佳选择是,不显示不可选择的项目。

    更新

    正如评论中所承诺的,这里的 Dispatcher-Code 设置 SelectedItem 延迟:

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

    我认为这会有所帮助,但它不是很好。如果您有可能禁用或隐藏这些项目,这会好得多。顺便说一句,我将 ContextIdle 用于调度程序优先级。这是一个非常强大的价值。您可以根据自己的需要选择适合的值。

    CoerceValueCallback

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

    【讨论】:

    • 抱歉,我无法禁用该项目。验证失败仅基于 SelectionChanged 事件中的验证逻辑
    • @ksvimal:您可以尝试使用 Dispatcher 进行选择。在所有 UI-Work 完成后,它将被重新选择。这将有所帮助,但是 IMO 是一个肮脏的黑客。我会用一个例子来更新我的答案。
    • 嗨,它有效。感谢您的反馈 :-) 我可以要您的私人邮件 ID 吗?
    • 嗨,关于这个问题,我还有另一个问题。您的代码工作正常,但问题是用户可以看到选择进入第三行,然后再次进入第二行。我不想改变选择。也就是说,如果验证失败,我想停止 SelectionChange 本身。希望你明白我想说什么
    • 尝试 CoerceValueCallback 版本。它有点复杂,但可能会做你想做的事。另一种可能更简单的解决方案是创建一个名为 ValidatedSelectedItem 的 AttachedProperty,并在 DependencyPropertyChanged 事件中同步 ComboBox 的 SelectedItem。见msdn.microsoft.com/en-us/library/ms749011.aspx。对于此解决方案,您还可以使用 CoerceValueCallback 重置值,但您也可以直接在更改的处理程序中执行此操作。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2021-03-17
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多