在WPF ComboBox中查找项目
我知道在ASP.NET中,我可以使用
DropDownList1.Items.FindByText
我可以在WPF中为ComboBox使用类似的方法吗?
这是场景。
我有一个名为RestrictionFormat的表,其中包含一个称为RestrictionType的列,该类型是存储这些值的表的外键。
在我的编辑器应用程序中,当用户从ComboBox中选择RestrictionFormat时(这很好用),我将提取详细信息进行编辑。我使用第二个ComboBox来确保用户在编辑时仅选择一个RestrictionType。我已经具有RestrictionType表中的第二个组合框绑定属性,但是我需要更改它的选定索引以匹配记录中指定的值。
这是场景。
我有一个名为RestrictionFormat的表,其中包含一个称为RestrictionType的列,该类型是存储这些值的表的外键。
在我的编辑器应用程序中,当用户从ComboBox中选择RestrictionFormat时(这很好),我将拉出用于编辑的详细信息。我使用第二个ComboBox来确保用户在编辑时仅选择一个RestrictionType。我已经具有RestrictionType表中的第二个组合框绑定属性,但是我需要更改它的选定索引以匹配记录中指定的值。
这有意义吗?
解决方案
回答
在WPF中,可以使用FindName方法。
XAML:
<ComboBox Name="combo"> <ComboBoxItem Name="item1" >1</ComboBoxItem> <ComboBoxItem Name="item2">2</ComboBoxItem> <ComboBoxItem Name="item3">3</ComboBoxItem> </ComboBox>
代码隐藏文件
item1.Content = "New content"; // Reference combo box item by name ComboBoxItem item = (ComboBoxItem)this.combo.FindName("item1"); // Using FindName method
要按内容查找项目,可以使用UI自动化。
回答
而不是尝试绑定SelectedIndex,为什么不将ComboBox中的SelectedItem绑定到记录中的值呢?
换句话说,将ComboBox(或者其父级)的DataContext设置为选定的"记录",并将ComboBox上的SelectedItem绑定到"记录"上的公开属性。
如果我们可以提供一些代码段或者其他详细信息,则可能会有所帮助,以便使响应更加具体,并引用源记录和已填充的ComboBox中使用的变量和类型。
回答
可以使用ItemContainerGenerator吗?
ItemContainerGenerator包含一个采用对象参数的ContainerFromItem方法。如果我们引用了comboBox包含的完整对象(或者重构它的方法),则可以使用以下方法:
ComboBoxItem item = (ComboBoxItem)myComboBox.ItemContainerGenerator.ContainerFromItem(myObject);
回答
我们可以通过两种方式检索组合框项目:
按项目:
ComboBoxItem item = (ComboBoxItem) control.ItemContainerGenerator.ContainerFromItem(control.SelectedItem);
按索引:
ComboBoxItem item = (ComboBoxItem) control.ItemContainerGenerator.ContainerFromIndex(1);
回答
我们能否提供一些有关我们到底想做什么的背景信息?
我们将哪些对象放入组合框,并使用哪种方法? (我们是设置还是绑定ItemsSource属性?)
为什么需要通过"文本"查找项目? WPF中最常用的用法是将SelectedItem属性绑定到其他对象,以便我们可以使用表示形式检索/设置所选条目。是否有特定要求,我们需要在列表中找到特定项目?
最坏的情况是,我们可以使用Linq To Objects在将ComboBox绑定到的集合上执行搜索。
不要将ComboBoxItem(也就是说,当我们绑定ItemsSource时WPF在幕后为我们生成的元素)与SelectedItem一起使用,SelectedItem是我们绑定到集合中的实际对象。当我们不习惯WPF时,通常这就是大多数问题的根源。在极少数情况下,我们需要查找实际的ComboBoxItem。