2016-12-12 12 views
0

J'ai un ViewModel qui étend Galasoft.MvvmLight.ViewModelBase. J'y ai ceci:La collection observable dans MVVMLIght ne met pas à jour l'interface utilisateur

public ObservableCollection<Association> Delegation { get; set; } 

    private async void LoadDelegations() 
    { 
     Delegation.Clear(); 
     var delegations = await NetworkManager.GetDelegations(); 
     if(delegations== null) 
     { 
      return; 
     } 
     for (int i = 0;i< delegations.Count;i++) 
     { 
      Delegation.Add(delegations[i]); 
     } 
    } 

    private async void RemoveDelegation(string delegationId) 
    { 
     var response = await NetworkManager.RemoveDelegation(delegationId); 
     if (response.Result) 
     { 
      int i; 
      for (i = 0; i < Delegation.Count; i++) 
      { 
       if (Delegation[i].Id == delegationId) break; 
      } 

      await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       Delegation.RemoveAt(i); 
      }); 
     } 
    } 

Cette propriété est liée à un ListView:

<ListView ItemTemplate="{StaticResource AssociationTemplate}" 
      ItemsSource="{Binding Delegation}"/> 

Mon problème est que LoadDelegation jour l'interface utilisateur que parfois, au lieu de la RemoveDelegation jamais mettre à jour l'interface utilisateur.

Qu'est-ce que je fais mal?

+0

Je ne vois pas où vous créez la collection. Vous pouvez le créer après l'exécution de la liaison, vous devez donc émettre un événement PropertyChanged pour notifier l'interface utilisateur. (Je ne suis pas familier avec Galasoft.MvvmLight si.) –

+0

Pourquoi auriez-vous besoin d'un Dispatcher.RunAsync dans une méthode 'async void'? Quelque chose ne sent pas bon. –

+0

Je crée le constructeur Collection in ViewModel. Dispatcher.RunAsync permet à cette instruction de s'exécuter sur le thread UI, n'est-ce pas? –

Répondre

0

Je ne suis pas sûr de la procédure MVVM-Light, mais dans le modèle MVVM, le problème ici serait que vous utilisez la propriété auto-implémentée. Les propriétés implémentées automatiquement ne déclenchent donc pas l'événement INotifyPropertyChanged. Vous pouvez simplement modifier la propriété Auto-Implemented de la délégation. Vous pouvez le remplacer par une propriété privée `ObservableCollection;

public ObservableCollection<Association> Delegation 
    { 
     get { return delegation; } 
     set { delegation = value; RaisePropertyChanged("Delegation")} 
    }` 

Alors que RaisePropertyChanged est la méthode qui est appelée dès que les changements de propriété et permet la vue au courant. Et comme MVVM-Light fournit simplement la classe de base qui implémente l'interface INotifyPropertyChanged