Comment obtenir un ItemsSource pour actualiser ses bind?
J'ai une vue qui montre une listbox qui est lié à GetAll():
<DockPanel>
<ListBox ItemsSource="{Binding GetAll}"
ItemTemplate="{StaticResource allCustomersDataTemplate}"
Style="{StaticResource allCustomersListBox}">
</ListBox>
</DockPanel>
GetAll() est une ObservableCollection propriété dans mon ViewModel:
public ObservableCollection<Customer> GetAll
{
get
{
return Customer.GetAll();
}
}
qui à son tour appelle une GetAll() la méthode de modèle de qui lit un fichier XML pour remplir l'ObservableCollection.:
public static ObservableCollection<Customer> GetAll()
{
ObservableCollection<Customer> customers = new ObservableCollection<Customer>();
XDocument xmlDoc = XDocument.Load(Customer.GetXmlFilePathAndFileName());
var customerObjects = from customer in xmlDoc.Descendants("customer")
select new Customer
{
Id = (int)customer.Element("id"),
FirstName = customer.Element("firstName").Value,
LastName = customer.Element("lastName").Value,
Age = (int)customer.Element("age")
};
foreach (var customerObject in customerObjects)
{
Customer customer = new Customer();
customer.Id = customerObject.Id;
customer.FirstName = customerObject.FirstName;
customer.LastName = customerObject.LastName;
customer.Age = customerObject.Age;
customers.Add(customer);
}
return customers;
}
Tout cela fonctionne bien SAUF lorsque l'utilisateur passe à un autre point de vue, édite le fichier XML et revient à ce point de vue où les anciennes données est toujours à l'affiche.
Comment puis-je dire de ce point de vue à "actualiser ses liaisons" de sorte qu'il affiche les données réelles.
Il se sent comme je vais sur WPF ici avec trop de HTML/HTTP métaphore, je sens qu'il y a un moyen plus naturel pour obtenir ObservableCollection de mettre à jour lui-même, d'où son nom, mais c'est la seule façon que je peux obtenir à l'utilisateur d'être en mesure de modifier des données dans une application WPF pour le moment. Alors de l'aide à n'importe quel niveau est apprécié ici.
OriginalL'auteur Edward Tanguay | 2009-04-30
Vous devez vous connecter pour publier un commentaire.
Un
ItemsControl
demandes de sa liaison une fois et des caches de la référence par la suite.Si le contenu de l'objet de collection sont modifiés, et il met en œuvre
INotifyCollectionChanged
(commeObservableCollection
), il va ramasser toutes les ajoutés ou supprimés de l'objet.Maintenant, si vous voulez la liaison à un nouvel objet de collection pour les
ListBox
, vous pouvez avoir votre point de vue-modèle à mettre en œuvreINotifyPropertyChanged
et d'éleverPropertyChanged
, en passantGetAll
comme le nom de la propriété.Cela aura pour effet d'avertissement de la liaison que la valeur de la propriété a changé (il y a un nouveau
ObservableCollection
prêt à être ramassé), dont il sera d'alimentation à l'ListBox
, qui re-générer ses éléments.Donc, tant que vous effectuer des changements à partir de votre application, en travaillant sur la
ObservableCollection
retourné parGetAll
, vous pouvez ajouter et supprimer et la liste va rester en phase. Lorsque vous voulez récupérer modification extérieure (vous pourriez avoir un bouton actualiser quelque part, ou un point naturel où il fait sens pour recharger l'ensemble du fichier), vous pouvez avoir votre point de vue-modèle de soulever laPropertyChanged
événement, qui appelle automatiquement la propriété de lecture, qui va appeler la méthode statique, qui sera de retour une nouvelle collection.Nitpicker remarque: pourquoi donnez-vous des noms de méthode de propriétés?
Si les deux points de vue sont censés être synchronisés au cours de l'édition, alors oui, vous devez en quelque sorte partager le même objet. Dans votre cas, il pourrait y avoir un Accès aux Données du système que des charges et des caches de la collection, et chaque ViewModel serait alors la demande de la collection actuelle. De cette façon, ils sont tous les deux conscients de chaque autres de la modification. Maintenant, si vous avez besoin de recharger la collection à partir du fichier, vous avez une façon d'avertir tous les viewmodel que l'objet de collection a changé, de sorte qu'ils peuvent élever leur événement PropertyChanged une fois qu'ils ont obtenu la nouvelle référence.
Donc pour l'instant ma solution pour actualiser la base de données chaque fois que le contrôle de l'utilisateur (point de vue) est chargé, fonctionne très bien, merci!
Ça serait bien de savoir d'où cela est mis en cache. (J'ai un problème lorsque le cache est mise à jour quand il ne devrait pas.) Se sentir comme une mise à jour avec le peu d'info?
Assurez-vous d'ajouter une liaison bidirectionnelle à la Liste
OriginalL'auteur Denis Troller
En dessous de la ligne de travail de même que lorsque nous supprimer pour ajouter un objet dans la collection:
OriginalL'auteur user2267032
De conserver une référence à votre
ObservableCollection
et le fichier XML de la dernière modification de la fois que vous avez chargé. Chaque fois que la fenêtre est activé, vérifiez l'horodatage sur le fichier du disque. Si ça a changé, claires et re-remplir leObservableCollection
. L'interface graphique est automatiquement écoute pour les événements de changement de laObservableCollection
et re-remplir automatiquement lorsque vous modifiez la collecte du contenu.OriginalL'auteur Joe White