Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WPF绑定列表框中删除项_C#_Wpf_Binding_Listbox_Itemssource - Fatal编程技术网

C# 从WPF绑定列表框中删除项

C# 从WPF绑定列表框中删除项,c#,wpf,binding,listbox,itemssource,C#,Wpf,Binding,Listbox,Itemssource,我有一个WPF应用程序,其中有一个ListBox(称为listMyItems),它成功地绑定到我创建的MyItems类。我有一个名为currentMyItems的MyItems列表,然后将其作为ItemSource分配给ListBox。这一切都很好,如果我在currentMyItems中添加一个项目,它会弹出列表,等等。 当我尝试删除列表框中的选定项时,会出现此问题。这是我使用的代码: currentMyItems.Remove((MyItem)listMyItems.SelectedItem)

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

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

该项目从列表框中消失,但下次我更新它时,它会弹出,因为它从未被删除。有什么提示吗?

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


还考虑绑定ListView的SelectedItem属性——您的视图模型根本不需要了解视图。

< P>我想您可能对数据绑定如何工作感到困惑。当您绑定一个属性时,您告诉WPF去其他地方查找该属性的值

当您将
ListBox.ItemsSource
属性绑定到
currentMyItems
时,您告诉WPF去查看
currentMyItems
列表以查找其项目列表。如果
currentMyItems
ObservableCollection
而不是
列表
,则当您从集合中添加或删除项目时,UI将自动收到更新绑定值的通知

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

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

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

如果您感兴趣,我的博客上还有一些初学者文章,供那些努力理解DataContext的WPF用户阅读。您可能希望签出并

currentMyItems
设置为
可观察选项
。这样,每当修改时,它都会引发属性更改,UI也会相应地更新

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

您应该使用ObservableCollection而不是List。
当源集合必须是modufy(从IList或ICollection继承)时,最好总是使用ObservableCollection而不是List。如果源集合不支持此接口删除方法,则无法从源中删除项

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

var source = listbox.ItemsSource as IList ?? listbox.ItemsSource as ICollection;
然后检查:

if (source == null) return;
然后:


但下次我更新它时
这到底意味着什么?您正在重新填充列表吗?是的,我正在动态地向列表中添加项目。+1对于绑定
SelectedItem
的建议,以及保持视图和视图模型层的分离更新
MyItems
集合似乎并不是您需要做的全部。它适用于第一个列表框,但是如果您想使用第一个列表框的
。SelectedItem
更新第二个列表框,该怎么办?执行MySelectedItems.Add((MyItem)listMyItems.SelectedItem)不会自动更新该框。我听过人们反复使用“ImplementiNotifyPropertyChanged”,但没有说如何更改。简单地像这样添加它:
public partial class main Window:Window,INotifyPropertyChanged
在顶部是不够的。更新一个
可观察的集合如何更新一个列表框?这里少了一块,没关系,我找到了。您必须将第二个框的
.ItemsSource
设置为您创建的第二个
可观察集合。一旦你这样做,它会自动更新。如果从未在代码隐藏中设置
.ItemsSource
属性,即使在XAML标记中设置,也不会进行更改。
if (source == null) return;
listbox.SelectedItems.ForEach(source.Remove);
listbox.Items.Refresh();