我正在尝试在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"/>
比方说,我在ListBox中有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
答案 0 :(得分:0)
由于您已经拥有“客户”项目,因此可以在以下条件下执行此操作:
this.Customers.Remove(item)
答案 1 :(得分:0)
您应该像使用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
源代码的情况下,我不能为您提供更多选择。
我还重构了一些代码。为变量起个好名字很重要。如果看起来有点不对劲,但我没有您的模型。
答案 2 :(得分:0)
如果您不想创建新的源集合,则可以从现有的源集合中删除项目。只要确保您没有在Remove
循环中调用foreach
方法即可。
这应该有效:
for (int i = Customers.Count - 1; i >= 0; i--)
{
Customer item = Customers[i];
if (item.Customers.ToUpper().Contains(CustomerSearch.ToUpper()) == false)
{
Customers.RemoveAt(i);
}
}
如果每次要添加或删除项目时都重置集合属性,则不妨使用List<T>
。只需确保在设置属性后引发属性通知即可。