wpf combobox防止文本发生变化

时间:2012-07-11 09:30:00

标签: wpf combobox selectionchanged

有没有办法阻止wpf组合框在选择更改后更改其文本?我有一个源自组合框的自定义控件,我希望能够在选择更改后手动设置文本,另外我无法阻止调用base.OnSelectionChanged(这样做但它必须留在那里作为一部分的要求)

2 个答案:

答案 0 :(得分:1)

通常,ComboBox的IsEditableIsReadOnly属性用于控制用户可以编辑或选择ComboBox的显示文本的级别。

msdn combobox(部分备注)中,您可以阅读相关内容。

答案 1 :(得分:0)

我有一个类似的问题需要解决,这就是我的做法:

  • My First ComboBox项目是一个实现NotifiyPropertyChanged的对象,我可以随时更改其值并进行更新。
  • 我将其IsEnabled设置为False,以便用户无法选择它。

如果您希望此项目以与其他项目相同的方式显示,即使已禁用,也请设计您的ItemTemplate。

  • 在SelectionChanged处理程序中,如果所选索引为0,则我什么都不做。
  • 如果selectedIndex不是第一个,我使用此索引进行计算(包括更新第一个项目的文本),然后将SelectedIndex设置为0。

编辑2:尝试将网格的IsHitTestVisible设置为False,并将CheckBoxes设置为True。

编辑1:如果第一个解决方案不起作用:那么核心问题是,当您单击某行而不是CheckBox时,它会触发SelectionChange。您需要做的是处理隧道左键单击事件:将一个处理程序(在xaml中比在代码中更简单)添加到PreviewMouseLeftButtonDown,并在处理程序中获取MouseButtonEventArgs的OriginalSource。首先通过检查原始源或其可视父对象是否是第二个CheckBoxItem来检查我们是CheckBox的第二选择(索引:1)。如果不然后返回。现在,如果OriginalSource是CheckBox或者是可视父级,则CheckBox不执行任何操作,否则将事件标记为已处理。

注意:您必须使用VisualTreeHelper.GetParent并编写一个子,用于检查Dependency对象或其父对象是否属于给定类型。 (最顶层的父节点是Window,Nothing / Null为父节点。)如果找到则该子节点将返回正确的类型对象,如果未找到则返回Noting / Null。