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
3 Réponses :
Puisque vous avez déjà l'article client, vous pouvez simplement le faire dans votre if:
this.Customers.Remove(item)
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.
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.
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.
Fonctionne bien pour moi. Je vous remercie.