4

我有一个带有 ListBox(称为 listMyItems)的 WPF 应用程序,它成功绑定到我创建的 MyItems 类。我有一个名为 currentMyItems 的 MyItems 列表,然后将其作为 ItemSource 分配给 ListBox。一切正常,如果我将一个项目添加到 currentMyItems 它会在列表中弹出,等等。当我尝试删除 ListBox 中的选定项目时会出现问题。这是我使用的代码:

currentMyItems.Remove((MyItem)listMyItems.SelectedItem);

该项目从 ListBox 中消失,但下次我更新它时,它会弹出回来,因为它从未被删除。有小费吗?

4

5 回答 5

13

我认为您可能对数据绑定的工作方式感到困惑。当您绑定一个属性时,您是在告诉 WPF 去其他地方寻找该属性的值。

当您将ListBox.ItemsSource属性绑定到 时currentMyItems,您是在告诉 WPF 查看currentMyItems列表以查找其项目列表。如果currentMyItems是 aObservableCollection而不是 a List<T>,那么当您从集合中添加或删除项目时,UI 将自动接收更新绑定值的通知。

根据您在问题中所说的话,听起来您有两个集合,其中一个是绑定的,另一个用于在发生更改时重新创建第一个集合。这一切都不需要。

只需创建一个ObservableCollection<MyItem>,将其绑定到ListBox.ItemsSource属性,然后从该单个集合中添加或删除项目。它应该像你期望的那样工作。

<ListBox x:Name="listMyItems" ItemsSource="{Binding MyItems}" />

MyItems.Add((MyItem)listMyItems.SelectedItem)
MyItems.Remove((MyItem)listMyItems.SelectedItem)

如果您有兴趣,我的博客上还有一些初学者文章,供那些努力理解 DataContext 的 WPF 用户使用。您可能想查看了解从 WinForms 切换到 WPF 时思维方式的变化以及您所说的“DataContext”是什么?

于 2013-11-12T19:35:15.100 回答
3

如果您将其正确绑定到 ObservableCollection 并且 currentMyItems 就是该集合。这意味着您必须同时重新加载 currentMyItems 。

还可以考虑绑定 ListView 的 SelectedItem 属性——你的视图模型根本不需要知道视图。

于 2013-11-12T19:20:45.650 回答
1

您的源集合必须是 modufy(从 IList 或 ICollection 继承)。如果您的源集合不支持您的接口 Remove 的这种方法,则无法从源中删除项目。

因此,当您想要删除项目时,您必须将 ItemsSource 转换为 IList 或 ICollection:

var source = listbox.ItemsSource as IList ?? listbox.ItemsSource as ICollection;

然后检查:

if (source == null) return;

然后:

listbox.SelectedItems.ForEach(source.Remove);
listbox.Items.Refresh();
于 2014-08-05T13:21:48.360 回答
1

制作currentMyItems<MyItem>一个 ObservableColection<MyItem>. 这样,它会在修改时引发属性更改,并且 UI 会相应地更新。

于 2013-11-12T19:43:16.013 回答
0

通过使用 ObservableCollection,您将自动获得 UI 上的更新。

您应该使用 ObservableCollection 而不是 List。一件好事是在与 UI 相关时始终使用 ObservableCollection 而不是 List

于 2013-11-12T20:14:55.757 回答