在combobox中,如何确定突出显示的项目(未选择项目)?

首先,公平警告:我是C#和WPF的完全新手。

我有一个combobox(可编辑,可搜索),我希望能够拦截删除键并从列表中删除当前突出显示的项目。 在输入电子邮件地址时,我正在寻找的行为类似于MS Outlook。 当您给出几个字符时,会显示潜在匹配的下拉列表。 如果您移动到其中一个(使用箭头键)并单击“删除”,则会永久删除该条目。 我想在combobox中输入一个条目。

这是XAML(简化):

 

处理程序是:

 private void Directory_KeyUp(object sender, KeyEventArgs e) { ComboBox box = sender as ComboBox; if (box.IsDropDownOpen && (e.Key == Key.Delete)) { TrimCombobox("DirectoryList", box.HighlightedItem); // won't compile! } } 

使用调试器时,我可以看到box.HighlightedItem具有我想要的值,但是当我尝试输入该代码时,它无法编译:

System.Windows.Controls.ComboBox' does not contain a definition for 'HighlightedItem'...

那么:我如何访问该值? 请记住,该项目尚未被选中。 它只是在鼠标hover在它上面时突出显示。

谢谢你的帮助。

这是显示调试器显示的屏幕截图。 我在“盒子”上盘旋,当显示单行摘要时,我然后在+ char上方盘旋以扩展到此图像:

alt text http://sofzh.miximages.com/c%23/www.freeimagehosting.net

突出显示的项目属性是非公共成员,因此您无法从其他类调用它。

alt text http://sofzh.miximages.com/c%23/www.freeimagehosting.net

我相信您需要使用Reflection来获取非公开成员。 这是关于这个主题的SOpost: 访问非公共成员 – ReflectionAttribute

以下是Jean Azzopardi答案启发的最终代码。 在调试器中显示的HighlightedItem是非公共属性,我使用GetType().GetProperty().GetValue()序列强制访问GetType().GetProperty().GetValue()

 private void Directory_KeyUp(object sender, KeyEventArgs e) { ComboBox box = sender as ComboBox; if (box.IsDropDownOpen && (e.Key == Key.Delete)) { const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance; PropertyInfo hl = box.GetType().GetProperty("HighlightedItem", flags); if (hl != null) { String hlString = hl.GetValue(sender, null) as String; // TODO: remove from DirectoryList } } } 

您可以创建自己的DrawItem事件处理程序,并在项目被主动绘制时保存项目的索引,并保留DrawItemState.Selected(即突出显示的)项目。

 void Main() { Application.Run(new Form1()); } public partial class Form1 : Form { ComboBox ComboBox1; string[] ds = new string[]{"Foo", "Bar", "Baz"}; public Form1 () { InitializeComboBox(); } private void InitializeComboBox() { ComboBox1 = new ComboBox(); ComboBox1.DataSource = ds; Controls.Add(ComboBox1); ComboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; ComboBox1.DrawItem += new DrawItemEventHandler(ComboBox1_DrawItem); } private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); e.Graphics.DrawString(ds[e.Index],ComboBox1.Font,Brushes.Black,e.Bounds); if (e.State == DrawItemState.Selected) { //stores the "HighlightedIndex" in the control's tag field. Change as you see fit. ComboBox1.Tag = e.Index; //Console.WriteLine(e.Index); } } } 

System.Windows.Controls.ComboBox的定义不包含属性HighlightedItem – 这就是为什么你的代码不能编译。

您使用的是从System.Windows.Controls.ComboBox派生的combobox吗? 然后将其强制转换为适当的类型。

稍后注意:如果你想捕捉ComboBox突出显示的事件,请阅读此链接 – 它正好解决了这个问题。