Une meilleure façon de forcer les données liées WPF zone de liste à mettre à jour?
J'ai WPF ListBox qui est lié à une ObservableCollection,
lors de la collecte des changements, tous les éléments de mise à jour de leur position.
La nouvelle position est stockée dans la collection, mais l'INTERFACE n'est pas mise à jour.
J'ai donc ajouté ce qui suit:
void scenarioItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
ToolboxListItem.UpdatePositions();
lstScenario.ItemsSource = null;
lstScenario.ItemsSource = ToolboxListItem.ScenarioItems;
this.lstScenario.SelectedIndex = e.NewStartingIndex;
}
Par la définition de la ItemsSource à null et puis la lier à nouveau, l'INTERFACE utilisateur est mise à jour,
mais c'est probablement très mauvais codage :p
Suggestions?
- Pouvez-vous veuillez donner plus de détails sur ce que tu veux dire par "quand la collection des changements, tous les éléments de mise à jour de leur position", juste pour que je puisse être sûr que je réponds à votre question correctement?
InformationsquelleAutor TimothyP | 2008-10-31
Vous devez vous connecter pour publier un commentaire.
J'ai une Listbox lié à une propriété de l'objet, qui est de type
List<MyCustomType>()
et j'ai vérifié que le code suivant des mises à jour de la liste lorsque la Liste est mise à jour.Si vous êtes toujours face à des questions, analyser les VS IDE de sortie de la fenêtre (Ctrl+W, O) et voir si vous pouvez repérer toute erreur de liaison signalés.
WPF, la liaison d'une liste ou d'une collection d'éléments d'une ListBox, mais l'INTERFACE utilisateur de ne pas rafraîchissant une fois les éléments mis à jour, Résolu.
Je suis juste stupide. Alors que j'avais lu beaucoup de choses sur l'utilisation de
ObservableCollection<>
au lieu deList<>
, j'ai juste continué à ignorer cette suggestion et sont allés après d'autres suggestions, en vain. Suis de retour à mes livres et à relire. C'est assez bien expliqué queObservableCollection<>
est un must à utiliser, carList<>
ne fournit pas lesINotifyCollectionChange
interface nécessaire pour laListBox
à mettre à jour son affichage lors de la variation des éléments dans la collection.C'est le code mis à jour:
Assez simple, et ne nécessite rien d'autre (par exemple, Refresh()). Parce que ObservableCollection prend en charge lui-même du déclenchement de l'événement de changement, j'ai été en mesure de supprimer les inutiles appel:
ObservableCollection
ne prend pas en charge une mise à jour par un thread qui n'a pas le créer. Parce que ma liste (un visual log pour voir les dernières erreurs/messages d'infos) peut être mis à jour à partir de différents threads, j'ajoute à adapter mon code de cette façon à assurer la mise à jour a été effectuée avec la liste du répartiteur propres:Également noter que
ObservableCollection<>
ne prend pas en chargeRemoveRange()
contrairement àList<>
. Cela fait partie de l'réglages nécessaires lors de la commutation de la Liste pour ObservableCollection.J'ai peut-être eu un problème similaire à ce que vous éprouvez, mais je ne suis pas sûr.
J'ai eu un
ObservableCollection<MyEntity>
et unListBox
lié à elle. Mais pour certains raison étrange monListBox
n'a pas été mis à jour quand j'ai changé les propriétés de laMyEntity
des objets dans la liste.Après avoir cherché pendant un moment j'ai trouvé la page suivante et j'ai juste eu à vous laisser savoir:
http://www.wblum.org/listbind/net3/index.html
C'est une très bonne description de ce que vous avez à faire pour obtenir un
ListBox
à la mise à jour de la liste, ou les objets qu'il contient, les changements. En espérant que vous aurez l'avantage de ce.ListBox
était intéressant pour moi.J'ai eu le même problème hier, et c'est un morceau de merde 🙂 ... je ne suis pas le réglage de la mine à nul plus que. Dans mon scénario, je suis un réglage à MyList.ToArray() (chaque fois que j'ajoute à la liste).
J'ai vu plusieurs "oh, vous devez utiliser un ObservableList" <-- de la merde complète.
J'ai vu plusieurs "oh, appelez 'Actualiser'" <-- de la merde complète.
Veuillez pardonner mon upsettedness, mais je voudrais aussi s'attendre à ce travail 🙂
C'est des vieux trucs mais, utiliser une ObservableCollection. SI vous voulez de l'INTERFACE utilisateur pour voir les mises à jour des propriétés à l'objet de l'ObservableCollection vous devez implémenter INotifyPropertyChanged dans la classe defenition pour cet objet. Puis élever la propriété a changé de cas dans le setter de la propriété.
Si vous avez un ObservableList d'objets, et vous êtes à la modification des propriétés à l'intérieur de ces objets, la notification ne s'applique pas car la collection n'est pas de changer directement. J'ai été contraint de notification après changement de mon propriétés de l'objet en utilisant Insert() pour ajouter de nouveau ma changé objet de la collection, puis RemoveAt() pour supprimer l'ancienne version. C'est pas joli, mais il fonctionne.
Pour moi, ça ressemble plus à un bug dans la zone de liste et Liste. Je suis de liaison à une ObservableCollection, les éléments de la collection implémenter INotifyPropertyChanged. L'INTERFACE utilisateur montre pas ajouté des éléments lorsque je dynamiquement sur mon 'ajouter un élément" bouton toutefois, j'ai un compteur de contrôle est lié à MyCollection.Le comte. Cette commande de compteur s'incrémente à chaque fois que je presse mon "ajouter un élément" bouton. Si je redimensionner l'affichage, la zone de liste affiche tous mes éléments ajoutés. Ainsi, la ItemSource de liaison sur le contrôle ListBox est cassé. J'ai également pris soin de ne pas créer un nouveau MyCollection à tout moment, ce qui permettrait de rompre la liaison. Boo hoo.