Как удалить объекты из списка, привязанного к ObservableCollection в C # MVVM - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать шаблон MVVM в C #.Поэтому у меня есть класс клиента:

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 в ListBox.Существует TextBox, который содержит строку.Теперь я хочу удалить все объекты в ListBox, которые не содержат строку.Я решил проблему во 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 голосов
/ 14 февраля 2019

Вы должны использовать метод 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);

Iне могу предложить вам больше вариантов без исходного кода havig CustomerList и RemoveItemsFromView.

Кроме того, я немного переработал код.Важно иметь хорошее имя для переменных.И если выглядит немного не так, но у меня нет вашей модели.

0 голосов
/ 14 февраля 2019

Если вы не хотите создавать новую исходную коллекцию, вы можете удалить элементы из существующей.Просто убедитесь, что вы не вызываете метод 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>.Просто убедитесь, что вы вызываете уведомление свойства, когда свойство установлено.

0 голосов
/ 14 февраля 2019

Так как у вас уже есть пункт Customer, вы можете просто сделать это внутри своего, если:

this.Customers.Remove(item) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...