有什么方法可以防止 wpf 组合框在选择更改后更改其文本?我有一个从组合框派生的自定义控件,我希望能够在选择更改后手动设置文本,另外我不能阻止调用 base.OnSelectionChanged(这可以解决问题,但它必须保留在那里作为要求)
2 回答
通常,ComboBox 的IsEditable
和IsReadOnly
属性用于控制 ComboBox 的显示文本可编辑或用户可选择的级别。
在msdn 组合框(部分备注)中,您可以阅读它。
我有一个类似的问题要解决,我是这样做的:
- 我的第一个 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。