簡體   English   中英

從WPF綁定列表框中刪除項目

[英]Removing an item from a WPF binding listbox

我有一個帶有ListBox(名為listMyItems)的WPF應用程序,它成功綁定到我創建的一類MyItems。 我有一個名為currentMyItems的MyItems列表,然后將其作為ItemSource分配給ListBox。 一切正常,如果我將一個項目添加到它彈出列表上的currentMyItems等,當我嘗試刪除ListBox中的選定項目時會出現問題。 這是我使用的代碼:

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

該項目從ListBox中消失,但下次更新時,它會彈回,因為它從未被刪除。 有小費嗎?

我想你可能會對數據綁定的工作方式感到困惑。 綁定屬性時,您告訴WPF去其他地方尋找該屬性的值。

ListBox.ItemsSource屬性綁定到currentMyItems ,您告訴WPF查看currentMyItems列表以查找其項列表。 如果currentMyItemsObservableCollection而不是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”是什么?

如果將它正確綁定到ObservableCollection並且currentMyItems是該集合。 這意味着你必須同時重新加載currentMyItems。

還可以考慮綁定ListView的SelectedItem屬性 - 您的視圖模型根本不需要了解視圖。

使currentMyItems<MyItem>成為ObservableColection<MyItem> 這樣,無論何時修改都會引發屬性更改,並相應地更新UI。

您的源集合必須是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();

通過使用ObservableCollection,您將自動獲得UI上的更新。

您應該使用ObservableCollection而不是List。 一個好處是在與UI有關時總是使用ObservableCollection而不是List

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM