【问题标题】:wpf combobox prevent text changedwpf组合框防止文本更改
【发布时间】:2012-07-11 09:30:00
【问题描述】:

有什么方法可以防止 wpf 组合框在选择更改后更改其文本?我有一个从组合框派生的自定义控件,我希望能够在选择更改后手动设置文本,另外我不能阻止调用 base.OnSelectionChanged(这可以解决问题,但它必须保留在那里作为要求)

【问题讨论】:

  • 能否详细说明问题。
  • 也许你可以告诉我们你想要什么而不是你想要阻止什么。

标签: wpf combobox selectionchanged


【解决方案1】:

一般来说,ComboBox 的IsEditableIsReadOnly 属性用于控制ComboBox 的显示文本可编辑或用户可选择的级别。

您可以在msdn combobox(部分备注)中了解它。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

    • 我有一个自定义组合框,其中包含带有复选框列的 gridview - 我想要实现的是拥有可编辑的文本字段,以便我可以根据用户输入选中/取消选中该网格中的复选框。另一方面,当用户单击列表(或整行)上的复选框时,我想连接所有选择并将它们显示在文本字段中。当我选中/取消选中复选框或在文本字段中手动写入文本时,这工作正常不幸的是,单击该行会调用 OnSelectionChanged,它会自动调用我的绑定文本的设置器(这必须是双向绑定)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 2013-07-22
    相关资源
    最近更新 更多