J'ai l'observation (entité) associée à Icollectionview Tout fonctionne bien jusqu'à ce que j'essaie de supprimer l'entrée. Après avoir cliqué sur le bouton 'Supprimer', l'interface n'est pas mise à jour. Si je définis l'Observecollection, tout fonctionne bien
private ICollectionView _taskview; public ICollectionView TasksView { get { return _taskview; } set { _taskview = value; OnPropertyChanged("TaskView"); } } public ICommand DeleteTask { get { return new DelegateCommand(() => { _context.Task.Attach(SelectTask); _context.Task.Remove(SelectTask); _context.SaveChanges(); Tasks = new ObservableCollection<TaskModel>(_context.Task); TasksView = CollectionViewSource.GetDefaultView(Tasks); }); } } public HomeViewModel(Window window) { this.window = window; Tasks = new ObservableCollection<TaskModel>(_context.Task); TasksView = CollectionViewSource.GetDefaultView(Tasks); } <ListBox Grid.Row="1" Grid.RowSpan="2" Grid.Column="0" SelectionMode="Extended" ItemsSource="{Binding TasksView}" SelectedItem="{Binding SelectTask}"> </ListBox>
3 Réponses :
Appeler Actualiser () sur Afficher la propriété de Collectionviewsource pour la faire rafraîchir. P>
Ne créez pas une nouvelle instance de TaskView dans le délégué, mettez à jour le contexte et après l'actualisation de cet appel.
C'est drôle qu'avec l'observatoire tout fonctionne comme il se doit, en même temps que je regarde Icollectionview dans le débogueur et ses données sont mises à jour, alors onproperty fonctionne, cependant, l'interface utilisateur ne change toujours pas pour une raison quelconque, c'est très étrange.
Pouvez-vous partager votre référentiel?
Désolé si le format est gênant, voici le lien ZIP: FayloobMennik.cloud/7401165 (n'a pas téléchargé de terribles choses à Github)
Ne créez pas une nouvelle collection après chaque suppression. Cela aura un impact négatif sur la performance. C'est la raison pour laquelle vous utilisez un Dans ce contexte, il n'a pas de sens à exposer La source de données comme Lorsque la collection Source d'un Lorsque la collection Source d'un Veuillez noter que vous devez jamais em > Référence Toute vue Composants dans votre modèle de vue - aucune exception. Cela élimine tous les avantages du MVVM. Et c'est jamais em> nécessaire, à coup sûr. Si votre modèle de vue nécessite une référence à un composant d'affichage que vous concevez votre code ou vos classes incorrects.
Pour suivre cette règle de conception MVVM fondamentale et fondamentale, vous em> devez em> supprimer la référence à la fenêtre code> de votre Vous devez lier à la Si vous souhaitez se lier au Observablecollection code>. De cette façon, la cible de liaison, par exemple, une liste code> est capable de mettre à jour les éléments modifiés uniquement, au lieu de recréer / rendu la vue complète.
IcollectionsView code>. Plutôt sur la liaison to the
Observablecollection code> directement. P>
IcollectionsView code> Implements
inotifidCollectionChanged code> Comme
Observablecollection < T> code> fait, alors le
iCollectionview code> se mettra automatiquement à jour lorsque la source change.
Dans ce cas, manipuler la collection inotifidCollectionChanged code> est suffisant. P>
IcollectionsView code> n'est pas em> Implémente
InotiifyCollectionChanged code> comme
Liste
ICollectionview code> ne sera pas em> mise à jour automatiquement lorsque la source change.
Dans ce cas, vous devez appeler explicitement icollectionview.refresh code> pour forcer le
icollectionview code> à mettre à jour. P>
homeviewModel code>.
Vous pouvez déclencher le comportement de la vue en exposant une propriété sur le modèle de vue qui est l'entrée pour un déclencheur de données dans la vue. Modèles - Applications WPF avec le modèle de conception Model-ViewModel Modèle , Le modèle de modèle-ViewModel . P> première solution (recommandé) H2>
Tâches Code> Collection directement.
Au moment où vous devez manipuler la vue de la collection, par exemple, d'appliquer un filtre récupérer la vue à l'aide de Collectionviewsource.getDefaultView (tâches) code>. Mais ne le lie pas. P>
deuxième solution h2>
icollectionview code>, vous ne pouvez pas 'T Besoin du
Observablecollection supplémentaire Code> plus (sauf que vous souhaitez gérer deux collections et un
Icollectionview CODE> sur chaque opération ADD / MODER / Supprimer / RESET). Pour mettre à jour l'appel de la collection
icollectionview.refresh code>. P>
Vous avez une faute de frappe sur: à onpropertychanged ("TaskView"); strong> il devrait être onpropertychanged ("Tasksview"); Code> p> p>
Observablecollection Code> Les outils ont l'événement
Collectionchangned code> quels signaux pour un "repeindre". Collez-le à l'utiliser Sinon, appelez
onpropertychanged code> après la suppression de l'action.
J'ai essayé de le faire aussi, mais le nombre d'enregistrements dans l'interface ne change toujours pas après avoir supprimé