![](/img/trans.png)
[英]How to Display Values from ObservaBleCollection in ComboBox In MVVM WPF C#
[英]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)
您應該使用的方法Remove
從Customers
喜歡你用做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);
如果不瀏覽CustomerList
和RemoveItemsFromView
源代碼,我不能建議您更多選擇。
另外,我重構了一些代碼。 為變量起個好名字很重要。 如果看起來有點不對,但我沒有您的模型。
如果您不想創建新的源集合,則可以從現有的源集合中刪除項目。 只要確保您沒有在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.