2011-07-19 3 views
0

J'ai un ListView lié à un fichier xml (un simple fichier journal).WPF - ListView xml Bindign ne fonctionne qu'une seule fois

Cette vue de liste se trouve dans une fenêtre de dialogue secondaire de mon projet.

Quand j'ouvre la fenêtre pour la première fois, il montre l'info dans la vue de la liste correctement. Ensuite, si je ferme cette fenêtre et que je fais des choses, mon fichier xml change. Si maintenant je rouvre la fenêtre de dialogue contenant le fichier xml, il montre le dernier état (l'info a montré la première fois que j'ai ouvert la fenêtre), pas tout le statut avec les mises à jour.

Pourquoi?

Répondre

1

Le XML ne déclenche pas les événements INotifyPropertyChanged que WPF databinding repose sur de savoir quand les éléments changent et doivent être re-lié. Vous pouvez définir explicitement ItemsSource ou DataContext chaque fois que vous ouvrez la boîte de dialogue.

De plus, les objets XML ne détectent pas les modifications de fichiers. Vous devrez peut-être recharger le fichier XML si vous comptez sur des événements externes (journaux système?) Pour créer les nouveaux nœuds XML.

+0

oh, merci. Étrange ... Je ne comprends pas pourquoi si je ferme une fenêtre, l'ItemSource reste paramétrée .. comment faire: je peux réinitialiser ItemSource? – Rick

+0

Par 'reset' ItemsSource/DataContext voulez-vous dire 'réaffecter'? Y a-t-il un autre moyen? – epalm

0

Il est difficile de dire exactement ce qui va résoudre votre problème parce que votre description est imprécise. Vous dites:

J'ai un ListView lié à un fichier xml (un fichier journal simple).

et ce n'est pas réellement possible. Vous ne pouvez pas lier un ListView, seulement son ItemsSource. Et vous ne pouvez pas lier à un fichier XML, mais seulement à un objet en mémoire qui contient les données lues à partir du fichier XML. J'ai l'impression que je choisis des lentes, mais je ne le suis pas: plus vous décrivez ce que vous faites réellement, plus il vous sera facile de vous fournir une réponse utilisable.

Il semble que vous définissiez probablement un XmlDataProvider en XAML avec son Source défini au nom du fichier XML. Si vous définissez cela comme une ressource dans votre fenêtre principale, il va être chargé lorsque la fenêtre principale est chargée. Si la fenêtre de votre enfant a quelque chose comme

<ListView ItemsSource="{StaticResource MyXmlDocument}" .../> 

il va rechercher le XmlDataProvider en utilisant la méthode de dictionnaire de ressources Find, et le trouver dans le dictionnaire de ressources de la fenêtre principale. Vous pouvez fermer et rouvrir la fenêtre enfant toute la journée et le XmlDataProvider qu'elle utilise ne changera pas.

Si c'est le cas, ce dont vous avez probablement besoin est l'une de deux choses.

D'abord, vous pouvez déplacer la définition de la ressource XmlDataProvider à XAML de la fenêtre enfant. Cela forcera la fenêtre enfant à recharger le XML chaque fois que la fenêtre enfant se charge.

Deuxièmement, vous pouvez ajouter une méthode à la fenêtre principale qui recrée la XmlDataProvider chaque fois que les modifications du fichier XML sur le disque. (Comment savoir quand le fichier XML change, et comment déclencher la méthode dans la fenêtre principale, sont des problèmes relativement difficiles à résoudre - vous pouvez utiliser les événements FileSystemWatcher, par exemple.) Vous devez utiliser l'extension DynamicResource dans votre fenêtre enfant XAML si vous faites cela.) Cela rafraîchira la fenêtre enfant chaque fois que le fichier XML change - même s'il est déjà ouvert.

+0

mmmh ... maintenant je comprends. Exactement j'ai le bindend ItemSource à un XmlDataProvider défini dans le app.xaml. J'ai essayé de définir la source xmldatasource dans le XAML de la victoire de l'enfant mais j'ai un problème avec le fichier utilisé comme ressource/contenu. Regardez ici http://stackoverflow.com/questions/6416918/wpf-bind-a-listview-to-a-xml-file-dynamically – Rick

Questions connexes