2
votes

Comment supprimer des objets d'une liste liée à une ObservableCollection dans C # MVVM

J'essaye d'utiliser le modèle MVVM en C #. Par conséquent, j'ai une classe de clients:

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

Je remplis une liste de clients d'une base de données:

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

Mon ViewModel:

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

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

J'ai lié des clients dans une WPF-ListBox:

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

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

Disons que j'ai 10 objets de CustomerName dans la ListBox. Il existe un TextBox qui contient une chaîne. Maintenant, je veux supprimer tous les objets de la ListBox qui ne contiennent pas la chaîne. J'ai résolu le problème dans le ViewModel comme suit:

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

Est-ce correct? Cela me semble mal, car chaque fois que la boucle supprime un élément, je crée une nouvelle ObservableCollection au lieu de manipuler l'existant. Existe-t-il un moyen plus professionnel de résoudre cette tâche?

Pour le PropertyChangeEvent , j'utilise FodyWeaver


0 commentaires

3 Réponses :


0
votes

Puisque vous avez déjà l'article client, vous pouvez simplement le faire dans votre if:

this.Customers.Remove(item) 


0 commentaires

0
votes

Vous devez utiliser la méthode Supprimer des Clients comme vous le faites avec CustomerList . Ou mettez à jour Clients après la boucle:

Première option

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

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

Deuxième option

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

Je ne peux pas vous suggérer plus d'options sans avoir un code source CustomerList et RemoveItemsFromView .

Aussi, j'ai refactoré un peu le code. Il est important d'avoir un bon nom pour les variables. Et si cela semble un peu faux, mais je n'ai pas votre modèle.


2 commentaires

Votre première option était la première que j'ai essayée par moi-même, mais cela crée une exception. Je vous remercie quand même, la réponse de mm8 a bien fonctionné pour moi.


Ouais, parce que l'utilisation du foreach, désolé pour ça. La deuxième option n'a pas fonctionné? Si vous l'utilisez, la vue ne sera actualisée qu'une seule fois. Au lieu de chaque fois que vous utilisez RemoveAt.



0
votes

Si vous ne souhaitez pas créer de nouvelle collection source, vous pouvez supprimer des éléments de la collection existante. Assurez-vous simplement de ne pas appeler la méthode Remove dans une boucle foreach .

Cela devrait fonctionner:

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

Si vous réinitialisez la propriété de la collection chaque fois que vous souhaitez ajouter ou supprimer un élément, vous pouvez également utiliser une Liste . Assurez-vous simplement d'envoyer une notification de propriété lorsque la propriété est définie.


1 commentaires

Fonctionne bien pour moi. Je vous remercie.