簡體   English   中英

如何從C#MVVM中綁定到ObservableCollection的列表中刪除對象

[英]How to remove objects from a list bound to an ObservableCollection in C# MVVM

我正在嘗試在C#中使用MVVM模式。 因此,我有一個客戶類別:

public class Customer
{
    public string CustumerNumber { get; set; }
    public string CustomerName { get; set; }
}

我用數據庫中的客戶填充列表:

public class CustomerList
{
    public static List<Customer> customerlist = new List<Customer>();

    public static List<Customer> GetCustomer()
    {
    // Get data from database
    }
}

我的ViewModel:

class ViewModel : BaseViewModel
{
    public ObservableCollection<Customer> Customers { get; set; }
    public string CustomerSearch { get; set; }

    public ViewModel()
    {
         Customers = new ObservableColletion<Customers>(CustomerList.GetCustomer());
    }
}

我將客戶綁定在WPF-ListBox中:

<ListBox ItemsSource="{Binding Customers}"
DisplayMemberPath="CustomerName"/>

假設我在列表框中有10個CustomerName對象。 有一個包含字符串的TextBox。 現在,我要刪除列表框中所有不包含字符串的對象。 我解決了ViewModel中的問題,如下所示:

public void SearchCustomer()
{
    foreach (Customer item in Customers)
    {
        if (item.Customers.ToUpper().Contains(CustomerSearch.ToUpper()) == false)
        {
            this.Customers = new ObservableCollection<Customer>(CustomerList.RemoveItemsFromView(item));
        }
    }
}

這是正確的嗎? 這對我來說是錯的,因為每次循環刪除一個項目時,我都會創建一個新的ObservableCollection而不是操縱現有的項目。 有沒有更專業的方法來解決此任務?

對於PropertyChangeEvent我使用FodyWeaver

由於您已經擁有“客戶”項目,因此您可以在以下情況下執行此操作:

this.Customers.Remove(item) 

您應該使用的方法RemoveCustomers喜歡你用做CustomerList 或在循環后更新Customers

第一選擇

foreach (Customer customer in Customers)
{
    if (!customer.Customers.ToUpper().Contains(CustomerSearch.ToUpper()))
    {
        CustomerList.RemoveItemsFromView(customer);
        Customers.Remove(customer);
    }
}

第二種選擇

foreach (Customer customer in Customers)
{
    if (!customer.Customers.ToUpper().Contains(CustomerSearch.ToUpper()))
    {
        CustomerList.RemoveItemsFromView(customer);
    }
}

this.Customers = new ObservableCollection<Customer>(CustomerList);

如果不瀏覽CustomerListRemoveItemsFromView源代碼,我不能建議您更多選擇。

另外,我重構了一些代碼。 為變量起個好名字很重要。 如果看起來有點不對,但我沒有您的模型。

如果您不想創建新的源集合,則可以從現有的源集合中刪除項目。 只要確保您沒有在foreach循環中調用Remove方法即可。

這應該工作:

for (int i = Customers.Count - 1; i >= 0; i--)
{
    Customer item = Customers[i];
    if (item.Customers.ToUpper().Contains(CustomerSearch.ToUpper()) == false)
    {
        Customers.RemoveAt(i);
    }
}

如果每次要添加或刪除項目時都要重置collection屬性,則最好使用List<T> 只需確保在設置屬性時引發屬性通知即可。

暫無
暫無

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

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