我有一个带有ListBox(名为listMyItems)的WPF应用程序,它成功绑定到我创建的一组MyItems。我有一个名为currentMyItems的MyItems列表,然后将其作为ItemSource分配给ListBox。一切正常,如果我将一个项目添加到列表中弹出的currentMyItems等。 当我尝试删除ListBox中的所选项时,会发生此问题。这是我使用的代码:
currentMyItems.Remove((MyItem)listMyItems.SelectedItem);
该项目从ListBox中消失,但下次更新时,它会弹回,因为它从未被删除过。有什么提示吗?
答案 0 :(得分:10)
我认为您可能会对数据绑定的工作方式感到困惑。当你绑定一个属性时,你告诉WPF去别的地方寻找那个属性的值。
将ListBox.ItemsSource
属性绑定到currentMyItems
时,您告诉WPF查看currentMyItems
列表以查找其项目列表。如果currentMyItems
是ObservableCollection
而不是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用户使用。您可以查看Understanding the change in mindset when switching from WinForms to WPF和What is this “DataContext” you speak of?
答案 1 :(得分:2)
如果将其正确绑定到ObservableCollection并且currentMyItems是该集合。这意味着您必须同时重新加载currentMyItem。
还可以考虑绑定ListView的SelectedItem属性 - 您的视图模型根本不需要了解视图。
答案 2 :(得分:0)
将currentMyItems<MyItem>
设为ObservableColection<MyItem>
。这样,无论何时修改都会引发属性更改,并相应地更新UI。
答案 3 :(得分:0)
您的源集合必须是modufy(从IList或ICollection继承)。如果您的源代码集不支持此界面删除方法,则无法从源代码中删除该项。
因此,当您想要删除项目时,必须将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();
答案 4 :(得分:-1)
通过使用ObservableCollection,您将自动获得UI的更新。
您应该使用ObservableCollection而不是List。 一个好处是在与UI
有关时总是使用ObservableCollection而不是List