WPF从列表框中删除项目

时间:2011-04-04 19:03:13

标签: c# wpf event-handling

我在WPF中有一个使用ItemSource属性绑定到ObservableCollection的列表框。这很好,显示正确的项目。

列表框(包含图像名称列表)在SelectionChanged事件上有一个事件处理程序,它使用所选图像的路径更新Image控件的源(有效地提供图像预览)。

我有以下代码从lisbox中删除项目,在按钮的点击事件中:

if (lstLocal.SelectedIndex > -1)
{
    localImages.RemoveAt(lstLocal.SelectedIndex);
}

localImages是ObservableCollection,lstLocal是ListBox

但是,当我删除所选项目时,会导致SelectionChanged事件触发。我的SelectionChanged事件处理程序使用列表框上的SelectedIndex属性。我得到了exe Index was out of range. Must be non-negative and less than the size of the collection.,所以我猜测删除一个项会导致SelectedIndex设置为null(或负数)?

有解决这个问题的方法吗?我猜我有更好的方法来删除项目,或者我需要对SelectionChanged处理程序进行某种检查?

2 个答案:

答案 0 :(得分:1)

将代码包装在

中的SelectionChanged处理程序中
if (lstLocal.SelectedItem != null)
{
...
}

答案 1 :(得分:1)

啊,这是ListBox控件的经典烦恼。更改绑定集合时,它可以清除选择并将滚动位置重置为顶部。当您必须从列表中选择项目并将其作为工作流程的一部分逐个编辑时,这真的很烦人。

更改列表时,您可能希望维护“当前选定的项目”对象引用,以便在幕后更改某些内容时可以保留选择。然后你也可以确保它存在,它通过使用ScrollIntoView方法滚动回那个项目而保持在视图中。

SelectedIndex为-1表示没有选择任何内容,因为您已经记住了。在SelectedItem属性存在之前,这是pre -.NET的一个古老的延续。现在SelectedItem将在SelectedIndex为-1的同时为null。