0
votes

Icollectionview UI n'est pas mis à jour

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>


2 commentaires

Observablecollection Les outils ont l'événement Collectionchangned quels signaux pour un "repeindre". Collez-le à l'utiliser Sinon, appelez onpropertychanged 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é


3 Réponses :


0
votes

Appeler Actualiser () sur Afficher la propriété de Collectionviewsource pour la faire rafraîchir.


4 commentaires

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)



0
votes

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 Observablecollection . De cette façon, la cible de liaison, par exemple, une liste est capable de mettre à jour les éléments modifiés uniquement, au lieu de recréer / rendu la vue complète.

Dans ce contexte, il n'a pas de sens à exposer La source de données comme IcollectionsView . Plutôt sur la liaison to the Observablecollection directement.

Lorsque la collection Source d'un IcollectionsView Implements inotifidCollectionChanged Comme Observablecollection < T> fait, alors le iCollectionview se mettra automatiquement à jour lorsque la source change.
Dans ce cas, manipuler la collection inotifidCollectionChanged est suffisant.

Lorsque la collection Source d'un IcollectionsView n'est pas Implémente InotiifyCollectionChanged comme Liste , alors le ICollectionview ne sera pas mise à jour automatiquement lorsque la source change.
Dans ce cas, vous devez appeler explicitement icollectionview.refresh pour forcer le icollectionview à mettre à jour.

Veuillez noter que vous devez jamais 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 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 devez supprimer la référence à la fenêtre de votre homeviewModel .
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 .

première solution (recommandé)

Vous devez lier à la Tâches 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) . Mais ne le lie pas. xxx

deuxième solution

Si vous souhaitez se lier au icollectionview , vous ne pouvez pas 'T Besoin du Observablecollection supplémentaire plus (sauf que vous souhaitez gérer deux collections et un Icollectionview sur chaque opération ADD / MODER / Supprimer / RESET). Pour mettre à jour l'appel de la collection icollectionview.refresh . xxx


0 commentaires

0
votes

Vous avez une faute de frappe sur: xxx

à onpropertychanged ("TaskView"); il devrait être onpropertychanged ("Tasksview");


0 commentaires