如何在C#MVVM

时间:2019-02-14 14:05:21

标签: c# wpf 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"/>

比方说,我在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

3 个答案:

答案 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);

在没有CustomerListRemoveItemsFromView源代码的情况下,我不能为您提供更多选择。

我还重构了一些代码。为变量起个好名字很重要。如果看起来有点不对劲,但我没有您的模型。

答案 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>。只需确保在设置属性后引发属性通知即可。