问题标签 [combobox]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1298 浏览

c# - WPF ListBox 或 ComboBox 中的 ItemActivated 事件

WPF ListBox 或 ComboBox 控件中是否存在 ItemActivated 事件(如在 Windows 窗体中)?我一个都看不到

没有一些事件做同样的事情似乎很疯狂——所以它只是换了个名字吗?如果没有,还有其他简单的方法吗?我看过各种关于此的博客文章,但它们似乎都涉及子类化控件和其他类似的东西。我确信 WPF 设计人员意识到这几乎是使用 ListBox 或 ComboBox 完成的最常见的事情!

我基本上是在寻找一个在激活项目时将触发的事件,告诉我哪个项目已激活并允许我访问该项目的属性。

0 投票
2 回答
509 浏览

c# - WPF 中类似于 FF3 AwesomeBar 的行为

我正在尝试在 WPF 中实现类似于 Firefox 3 AwesomeBar 的行为。我有一个 ComboBox 来使用 DataTemplate,它使下拉菜单看起来像 AwesomeBar 的下拉菜单,但我不确定如何获得正确的行为。

我想要发生的是让用户将他们的搜索输入到 ComboBox 的 TextBox 位中,然后逐渐缩小下拉列表中的结果。我想我可能可以让数据库查询部分工作(因为结果将来自数据库)但我想要得到的是用户开始输入时打开的下拉位(就像在 Firefox 中一样3) 然后自动选择列表中的第一个项目和列表中的其他项目,可以通过使用箭头键或单击它们来选择它们。

更新:

我现在找到了让 ComboBox 下拉的编程方式(使用 IsDropDownOpen = true),但我还有一些其他问题:

首先,当我输入某些内容时,它会下拉,但它不会选择与我正在输入的内容最接近的匹配项,其次,当我输入唯一选择一个项目的内容时,它会自动关闭并运行 SelectedItemChanged 方法。我希望它仅在我实际单击它或按 Enter 时关闭并运行代码(而不是仅使用向上或向下箭头进行选择)。任何想法如何让它做我想做的事?如果还不够清楚,我可以提供更多信息。

0 投票
7 回答
47797 浏览

wpf - 是否有任何可用的原生 WPF 多选组合框?

即使是第 3 方也可以。

谢谢

0 投票
2 回答
5292 浏览

c# - 从 ChildForm 添加数据后 ComboBox 刷新

将新数据添加到 Access 数据库后,我似乎无法刷新 ComboBox。

这是我用来添加新数据的代码:

0 投票
14 回答
56057 浏览

c# - 如何动态更改 C# 组合框或文本框中的自动完成条目?

我在 C# 中有一个组合框,我想使用自动完成建议,但是我希望能够在用户键入时更改自动完成条目,因为可能的有效条目太多而无法AutoCompleteStringCollection在启动时填充。

例如,假设我让用户输入名称。我有一个可能的名字列表(“Joe”、“John”)和一个姓氏列表(“Bloggs”、“Smith”),但如果我每个都有一千个,那么这将是一百万个可能的字符串 -太多,无法放入自动完成条目。因此,最初我只想将名字作为建议 ("Joe", "John") ,然后一旦用户输入了名字 ("Joe"),我想删除现有的自动完成条目并替换他们有一个新的集合,包括选择的名字和可能的姓氏(“Joe Bloggs”、“Joe Smith”)。为了做到这一点,我尝试了以下代码:

但是,这不能正常工作。似乎对 Clear() 的调用会导致自动完成机制“关闭”,直到下一个字符出现在组合框中,但是当然当下一个字符出现时,上面的代码再次调用 Clear(),所以用户永远不会实际上看到了自动完成功能。它还会导致组合框的全部内容被选中,因此在每次按键之间您必须取消选择现有文本,这使其无法使用。如果我删除对 Clear() 的调用,则自动完成工作,但似乎AddRange()调用无效,因为我添加的新建议不会出现在自动完成下拉列表中。

我一直在寻找解决方案,并看到了各种建议,但我无法让它们中的任何一个工作 - 自动完成功能似乎被禁用,或者没有出现新字符串。这是我尝试过的事情的清单:

  • BeginUpdate()在更改字符串之前和EndUpdate()之后调用。
  • 调用Remove()所有现有字符串而不是 Clear()。
  • 在我更新字符串时从组合框中清除文本,然后将其添加回来。
  • 在我更改字符串时将其设置AutoCompleteMode为“None”,然后将其设置回“SuggestAppend”。
  • 挂钩 TextUpdateorKeyPress事件而不是TextChanged.
  • 每次都AutoCompleteCustomSource用新的替换现有的。AutoCompleteStringCollection

这些都没有帮助,即使是各种组合。 Spence建议我尝试覆盖ComboBox获取要在自动完成中使用的字符串列表的函数。使用反射器,我在ComboBox类中发现了一些看起来很有希望的方法 -GetStringsForAutoComplete()SetAutoComplete(),但它们都是私有的,因此我无法从派生类访问它们。我不能再进一步了。

我尝试用 替换ComboBoxTextBox因为自动完成界面是相同的,我发现行为略有不同。它似乎工作得更好,因为TextBox自动完成的附加部分工作正常,但建议部分没有 - 建议框短暂地闪烁,然后立即消失。

所以我想“好吧,我会在没有 Suggest 功能的情况下生活,而只使用 Append”,但是当我将其设置AutoCompleteMode为 Append 时,我得到了访问冲突异常。Suggest 也会发生同样的事情 - 唯一不会引发异常的模式是SuggestAppend,即使 Suggest 部分的行为不正确。

我认为使用 C# 托管代码时应该不可能出现访问冲突异常。 Avram建议我使用“锁定”来解决此问题,但我不知道我应该锁定什么 - 唯一具有 SyncRoot 成员的是AutoCompleteStringCollection, 并且锁定不会阻止访问冲突异常。我也尝试锁定ComboBoxor TextBox,但这也无济于事。据我了解, lock 只会阻止其他锁,所以如果底层代码没有使用 lock 那么我使用它不会有任何区别。

所有这一切的结果是我目前无法使用动态自动完成的 aTextBox或 a 。ComboBox有人对我如何实现这一目标有任何见解吗?

更新:

我还没有得到这个工作,但我发现了更多。也许其中一些会激发其他人提出解决方案。

我尝试用 替换ComboBoxTextBox因为自动完成界面是相同的,我发现行为略有不同。它似乎工作得更好,因为TextBox自动完成的附加部分工作正常,但建议部分没有 - 建议框短暂地闪烁,然后立即消失。

所以我想“好吧,我会在没有 Suggest 功能的情况下生活,而只是使用 Append”,但是当我将其设置AutoCompleteMode为 Append 时,我得到了访问冲突异常。Suggest 也会发生同样的事情 - 唯一不会引发异常的模式是SuggestAppend,即使 Suggest 部分的行为不正确。

我认为在使用 C# 托管代码时应该不可能获得访问冲突异常,但无论如何,结果是我目前无法使用 aTextBox或 aComboBox任何类型的动态自动完成。有人对我如何实现这一目标有任何见解吗?

更新 2:

在尝试了各种其他事情(例如更改工作线程中的自动完成功能,并BeginInvoke()用于模拟 PostMessage() 类型的行为之后,我终于放弃了,只是使用列表框实现了我自己的自动完成下拉菜单。它比内置的响应速度更快,而且我花在这方面的时间比我试图让内置的工作的时间少,所以任何想要这种行为的人的教训是 - 你可能会更好自己实施。

0 投票
3 回答
5297 浏览

c# - 如何在 WPF 组合框中隐藏所选项目?

我想从打开的 WPF 组合框中隐藏选定的项目,基本上是为了显示而不是这个:

这:

如何才能做到这一点?

0 投票
10 回答
41189 浏览

wpf - 为什么我不能在 ComboBox 中选择空值?

在 WPF 中,似乎不可能(用鼠标)从 ComboBox 中选择“null”值。编辑澄清一下,这是.NET 3.5 SP1。

这是一些代码来说明我的意思。首先,C# 声明:

接下来,我的 Window1 XAML:

最后,我的 Window1 类:

与我一起?我有一个 ComboBox,其项目绑定到 Bar 实例列表,其中一个为空。我已将窗口绑定到 Foo 的一个实例,并且 ComboBox 正在显示其 Bar 属性的值。

当我运行这个应用程序时,ComboBox 以空显示开始,因为 Foo.Bar 默认为空。没关系。如果我使用鼠标将 ComboBox 放下并选择“Hello”项目,那也可以。但是,如果我尝试重新选择列表顶部的空项目,ComboBox 将关闭并返回其先前的“Hello”值!

使用箭头键选择空值按预期工作,并且以编程方式设置它也可以工作。它只是用不起作用的鼠标进行选择。

我知道一个简单的解决方法是拥有一个表示 null 的 Bar 实例并通过 IValueConverter 运行它,但是有人可以解释为什么用鼠标选择 null 在 WPF 的 ComboBox 中不起作用吗?

0 投票
2 回答
1728 浏览

c# - 控制在数据绑定 WPF ComboBox 的文本框部分显示哪个字段

我在 WPF 中有一个 ComboBox,它是数据绑定的,并且有一个数据模板来控制每个项目的显示方式。我已经做到了,每个项目都显示有两位文本(用于名称和路径属性)和一个图像(用于图标属性)。

当我从 ComboBox 中选择一个项目时,ComboBox 的文本框位只是更改为“TestWPF.Result”,这是我填充 ComboBox 的类的名称。

我对两件事中的一件(或两件)感兴趣:

  1. 如何更改它以显示其中一个字段的值(例如,它显示名称字段的值而不是类的名称)?

  2. 是否有可能让它在项目列表中使用相同的 DataTemplate,这样一旦我选择了一个项目,它就会以与项目列表中相同的方式显示在关闭的 ComboBox 中。基本上我有一个名为 ShowResults 的 DataTemplate 和一个使用该模板的 ComboBox。我还添加了一个单独的 ContentControl,我必须在 ComboBox 中显示所选项目的详细信息,但我想用它来替换 ComboBox 中的文本框。

更新:

感谢您的第一个答案。正如您所描述的,我尝试使用单独的 ContentControl,它工作正常。现在的问题是如何用这个 ContentControl 替换 ComboBox 的文本框部分。对此的任何提示都将受到欢迎。

此外,是否可以用 ContentControl 和文本框的混合替换 ComboBox 控件的文本框位,这样我仍然可以在文本框中键入以帮助从 ComboBox 中选择项目,但是当我关闭下拉列表时,其余的ContentControl 位将填充其余的文本和图标。希望这是有道理的 - 如果没有,请提出问题!

代码:

我被要求发布我的代码 - 所以就在这里。我试图删除我知道绝对不相关的东西,但我不确定到底什么是相关的,所以当有疑问时,我会把东西留在里面。

0 投票
3 回答
1946 浏览

wpf - ListBox 中的所有 ComboBox 在其中任何一个更改时都会更改

我有一个ListBox绑定到ObservableCollection自定义类型的表单。在每个项目中都有ComboBox一个枚举类型的绑定。窗口加载时,所有ComboBoxes 都默认为某个值。当我SelectedItem为任何一个(从 UI,而不是代码)更改 es 时,所有其他ComboBoxes 都更改为相同的SelectedItem.

我不确定我做错了什么,这是我当前正在处理的 XAML。

ListBox

我尝试了一些不同的选项,例如绑定到 a CollectionView; 但是似乎没有任何效果。谁能指出我的错误?

谢谢!

0 投票
5 回答
69908 浏览

c# - 文本中任意位置的 WPF 中 ComboBox 的自动完成(不仅仅是开始)

我在 WPF 中有一个 ComboBox,我用过很多次(它有一个自定义模板和一个自定义项模板)。我现在已经达到了它几乎可以按照我想要的方式工作的地步,除了当我在 ComboBox 中键入时,它正在为我进行过滤,但仅在假设我键入的内容开始时进行过滤组合框。

例如,如果我在 ComboBox 中有一个名为“Windows Media Player”的项目,它只会在我开始输入“Windows Media ...”时找到它,如果我开始输入“Media Play...”,它将找不到它. 有没有办法解决?我可以在某处设置一个属性来告诉它在整个字符串中搜索,而不仅仅是使用 StartsWith() 吗?

如果没有,最好的方法是让我自己做到这一点?有什么方法可以获取原始控制权,基本上只是将对 StartsWith() 的调用更改为对 Contains() 的调用,还是我必须走得更底层?