2010-02-09 7 views
2

J'ai un formulaire qui se lie à un ViewModel (MVVM). Dans le formulaire, j'ai un ItemsControl qui est lié à un élément appelé projets dans mon DataContext. Lorsque j'effectue une sauvegarde à l'aide d'un modèle de commande, j'enregistre l'élément et effectue une extraction, puis je souhaite redéfinir ItemsControl dans la collection Projects. Cette partie ne semble pas fonctionner, tous mes appels de service fonctionnent comme prévu, mais ma vue ne rebondit pas sur la nouvelle collection avec l'élément ajouté, même si elle est renvoyée par le serveur.ItemsControl MVVM Binding

Toute aide avec ceci serait vraiment appréciée.

XAML

<ItemsControl Name="ProjectGrid" 
     Background="Transparent" ItemsSource="{Binding Path=Projects}" Margin="0,0,0,0" VerticalAlignment="Top" 
     ItemContainerStyle="{StaticResource alternatingWithTriggers}" 
     AlternationCount="2" 
     ItemTemplate="{StaticResource ItemTemplate}"/> 

ViewModel

public ICommand SaveCommand 
    { 
     get 
     { 
      if (_cmdSave == null) 
      { 
       _cmdSave = new RelayCommand(Save, CanSave); 
      } 

      return _cmdSave; 
     } 
    } 

    public void Save() 
    { 
     MyService.Save(); 
     PopulateModel(); 
    } 

    private void PopulateModel() 
    { 
     Projects = MyService.GetProjects(); 
    } 

    public ProjectDto[] Projects 
    { 
     get { return _projects; } 
     set 
     { 
      if (_projects == value) 
       return; 

      _projects = value; 

      Notify(PropertyChanged, o => Projects); 
     } 
    } 
+0

Qu'est-ce que est-ce que la méthode Notify fait? Si vous implémentez INotifyPropertyChanged pour la notification de modification, je pense que WPF s'attend à ce que le gestionnaire soit appelé quelque chose comme PropertyChanged (this, "Projects"); – jeffora

+0

Je vais vérifier, mais je suis sûr que je le fais. – Burt

+0

@jeffora: C'est ce que fait 'Notify (PropertyChanged, o => Projects)'. Beaucoup passent à des méthodes d'assistance qui acceptent une expression lambda afin d'éviter d'utiliser des littéraux de chaîne. –

Répondre

1

Comme Aran Mulholland déjà dit, mettre en œuvre INotifyPropertyChanged dans votre ViewModel. Essayez également d'utiliser une collection ObservableCollection pour vos collections.
Et au lieu de remettre à zéro la collection, essayez d'utiliser

Projects.Clear(); 
MyService.GetProjects().ToList().ForEach(Projects.Add); 

Et comme une pointe, essayez de faire la méthode getProjects() async, il ne bloque pas l'interface utilisateur ...

+0

Collection observable fait l'affaire grâce à Roel – Burt

3

Assurez-vous que votre ViewModel met en œuvre INotifyPropertyChanged. Votre ui ne sera pas informé de la modification si votre modèle de vue ne l'informe pas lorsque la propriété change

utilisez un convertisseur de débogage pour vérifier si la liaison est défaillante. il y a un exemple here de la façon de le faire. C'est une technique dont chaque développeur a besoin.

im assez sûr de son NotifyPropertyChanged votre défaillant, le convertisseur de débogage vous dire pour certains

+1

+1 pour le lien du convertisseur de débogage, ce qui est une bonne chose (tm) –

+1

chaque projet, premier élément - convertisseur de débogage –

Questions connexes