Question

J'ai une vue qui présente une zone de liste liée à GetAll () :

.
<DockPanel>
    <ListBox ItemsSource="{Binding GetAll}"
             ItemTemplate="{StaticResource allCustomersDataTemplate}"
             Style="{StaticResource allCustomersListBox}">
    </ListBox>
</DockPanel>

GetAll () est une propriété ObservableCollection dans mon ViewModel:

public ObservableCollection<Customer> GetAll
{
    get
    {
        return Customer.GetAll();
    }
}

qui appelle à son tour une méthode de modèle GetAll () qui lit un fichier XML pour remplir 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 correctement SAUF lorsque l'utilisateur passe dans une autre vue, édite le fichier XML et revient à cette vue où les anciennes données sont toujours affichées . .

Comment puis-je indiquer à cette vue "d'actualiser ses liaisons" " afin qu'il affiche les données réelles.

On dirait que je parle de WPF ici avec trop d'une métaphore HTML / HTTP. Je sens qu'il existe un moyen plus naturel de permettre à ObservableCollection de se mettre à jour, d'où son nom, mais c'est le seul moyen d'obtenir de mon côté. l’utilisateur pour pouvoir éditer des données dans une application WPF pour le moment. Ici, l’aide est appréciée.

Était-ce utile?

La solution

Un ItemsControl demande sa liaison une fois et met la référence en cache par la suite.

Si le contenu de l'objet de collection est modifié et qu'il implémente INotifyCollectionChanged (comme le fait ObservableCollection ), il récupérera tout objet ajouté ou supprimé.

Maintenant, si vous souhaitez que la liaison fournisse un nouvel objet de collection au ListBox , vous pouvez demander à votre modèle de vue de mettre en œuvre INotifyPropertyChanged et de lever PropertyChanged , en passant GetAll en tant que nom de propriété. Cela aura pour effet d'avertir la liaison que la valeur de la propriété a changé (il y a un nouveau ObservableCollection prêt à être récupéré), qu'il fournira au ListBox , qui générera à nouveau ses éléments.

Tant que vous apportez des modifications à votre application et que vous travaillez sur la ObservableCollection renvoyée par GetAll , vous pouvez ajouter et supprimer la liste et la synchroniser. Lorsque vous voulez choisir des modifications externes (vous pouvez avoir un bouton d'actualisation quelque part ou un point naturel où il est logique de recharger tout le fichier), vous pouvez demander à votre modèle de vue de déclencher l'événement PropertyChanged . , qui appellera automatiquement le getter de propriété, qui appellera la méthode statique, qui retournera une nouvelle collection.

Note Nitpicker: pourquoi donnez-vous des noms de méthodes aux propriétés?

Autres conseils

La ligne ci-dessous fonctionne de la même manière que lorsque nous supprimons un objet de la collection:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();

Conservez une référence à votre ObservableCollection et à l'heure de la dernière modification du fichier XML au moment de son chargement. À chaque fois que la fenêtre est activée, vérifiez l’horodatage du fichier sur le disque. Si cela change, effacez et re-remplissez le ObservableCollection . L’interface graphique écoute automatiquement les événements de modification de ObservableCollection et se re-remplit automatiquement lorsque vous modifiez le contenu de la collection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top