以编程方式在列表框中选择项目/索引

17
在WPF中,我想要设置 System.Windows.Controls.ListBox 的选定索引。目前我找到的最佳方式是从控件中移除所有项,插入选定项,调用 SelectAll(),然后插入其余项,但这种解决方案在我的情况下不起作用,也不是非常高效。那么,如何以编程方式设置 ListBox 中的项目为选定状态呢?
6个回答

33

你可以使用SelectedItems集合来设置多个选中的项目。这不是按索引而是按绑定的内容进行的:

foreach (var boundObject in objectsBoundToListBox)
{
    ListBox.SelectedItems.Add(boundObject);
}

1
这将为每个添加的项目引发一次SelectionChanged事件。当您使用shift手动选择一组项目时,它只会为整个组引发一次。 - FreddyFlares

12

你可以通过向数据对象添加一个选中字段来实现这一点。然后,需要覆盖默认的列表框项样式,并将isselected属性绑定到对象中的Selected属性。接下来,只需遍历数据项并更新Selected值即可。

如果你不将Selected属性实现为依赖属性,则需要让你的类实现INotifyPropertyChanged接口,并在设置值时引发propertychanged事件。


谢谢!这个方法很好用。我只是在下面添加了一个我使用的代码段。 - Chathuranga Wijeratna
实际上,与Danlash的下面相比,这显得过于复杂了。 - henon

5
你需要做的是:
ListBoxObject.SelectedItem = ListBoxObject.Items.GetItemAt(itemIndex);

这里的itemIndex是您想要选择的项。如果您想要选择多个项,则需要使用ListBox.SelectedIndexCollection属性。


1
System.Windows.Controls.ListBox不像System.Windows.Forms.ListBox一样包含SelectedIndexCollection属性。 - Alex
但不要超过一个项目 - SelectedItems 是只读的。 - markmnl

3

您可以对多个部分执行此操作:

ListBoxObject.SelectedItems.Add(ListBoxObject.Items.GetItemAt(i));

其中 i 表示项目索引。


1
感谢 mdm20。 我的情况实际上是要检查 ListBox 中的 CheckBox,而这个 Dependency Property 工作得非常好。 我必须从 DependencyObject 继承我的自定义类并实现该属性。
public class ProjectListItem : DependencyObject{ 

    public Boolean IsChecked
    {
        get { return (Boolean)this.GetValue(CheckedProperty); }
        set { this.SetValue(CheckedProperty, value); }
    }
    public static readonly DependencyProperty CheckedProperty =
        DependencyProperty.Register("IsChecked", typeof(Boolean), typeof(ProjectListItem), 
                                    new PropertyMetadata(false));
}

-4
如何在WPF中以编程方式选择列表框中的多个项目
foreach (var boundObject in objectsBoundToListBox)
{
    ListBox.SelectedItems.Add(boundObject);
}

6
你真的是从这个帖子上的 danlash 复制并粘贴了这段话吗? - Epirocks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接