2010-05-20 3 views
1

J'ai une collection observable liée à une zone de liste dans WPF. L'une des options de la fenêtre consiste à utiliser un OpenFileDialog pour ajouter un élément à la liste avec certaines propriétés. Lorsque j'utilise OpenFileDialog, il définit deux des propriétés du nouvel élément dans la collection observable. J'utilise INotifyPropertyChanged pour mettre à jour la liste. Ces deux nouvelles propriétés sont définies correctement et maintenant la liste doit afficher le titre contenu dans la nouvelle propriété de titre et la zone de texte de titre qui est liée à la liste doit également afficher le nouveau titre. Cependant, ni affiche le nouveau titre à la fermeture de l'OpenFileDialog et quand je clique sur un autre élément dans la liste et revenez à l'élément que je viens de modifier met à jour la zone de texte titre, mais le titre affiché dans la zone de liste Je déplace l'élément dans la zone de liste que je veux changer.La liaison WPF ne se met pas à jour avant une autre action

Voici le code de liaison.

ItemsSource="{Binding Path=MyData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

Et voici la mise en œuvre du bouton de navigation qui ne fonctionne pas (L1 étant la zone de liste)

 private void browse_Click(object sender, RoutedEventArgs e) 
    { 
     OpenFileDialog opf = new OpenFileDialog(); 
     opf.ShowDialog(); 
     MyData[L1.SelectedIndex].Title = System.IO.Path.GetFileNameWithoutExtension(opf.FileName); 
     MyData[L1.SelectedIndex].Command = opf.FileName; 
    } 

Lorsque je tape simplement dans les zones de texte et cliquez sur eux, il met à jour la liste boîte immédiatement avec les nouvelles informations que j'ai mis. J'ai aussi un bouton créer et en cliquant dessus, il ajoute immédiatement un nouvel élément à la liste et met à jour ses propriétés. Le seul qui ne se met pas à jour correctement est ce morceau de code que je vous ai donné. Merci de votre aide.

EDIT:

Voici ma mise en œuvre de INotifyPropertyChanged

private OCLB _MyData; 
    public OCLB MyData 
    { 
     get 
     { 
      return _MyData; 
     } 

     set 
     { 
      _MyData= value; 
      FirePropertyNotifyChanged("MyData"); 
     } 
    } 

OCLB est la collection observable. Voici la fonction FirePropertyNotifyChanged

public event PropertyChangedEventHandler PropertyChanged; 

    private void FirePropertyNotifyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Chacun d'entre eux sont dans la classe MainWindow partielle pour la forme WPF. J'ai aussi une classe pour les fichiers MyData (avec 4 get/set) qui sont stockés dans l'OCLB (collection observable). Il y a aussi une classe avec des fonctions pour l'OCLB.

Répondre

4

Je pense que ce que vous voyez ici est que ObservableCollection ne déclenche pas l'événement PropertyChanged sur un élément de votre collection. Le formulaire parent ne reçoit aucune notification tant que vous n'avez pas fait défiler l'élément en question.

La raison pour laquelle votre nouveau bouton fonctionne est l'ajout d'un nouvel élément à la collection qui déclenche l'événement CollectionChanged sur ObservableCollection. Pour mettre à jour votre collection, vous devez implémenter un mécanisme de modification de propriété approprié sur les éléments de la collection. Par exemple, si vous créez, ObservableCollection<MyDataItem>, MyDataItem doit implémenter correctement INotifyPropertyChanged.

Espoir qui aide,

+0

J'ai ajouté ma mise en œuvre de INotifyPropertyChanged à ma question initiale maintenant si je peux trouver ce qui ne va pas avec elle. – mjstide

+0

MyData semble être votre collection. La classe contenant les propriétés "Title" et "Command" nécessite le traitement INotifyPropertyChanged. – SergioL

+0

Je désérialise un XML vers un conteneur. Ce conteneur est MyData. MyData est une ObservableCollection . MyClass contient les propriétés title et command. Voulez-vous dire que j'ai besoin de mettre les fonctions INotifyPropertyChanged dans MyClass? Ou dois-je changer pour un INotifyCollectionChange? – mjstide

Questions connexes