ListBox point n'est pas mis à jour lorsque la propriété a changé de
J'ai un problème de mise à jour de zone de liste contenant ObservableCollection, quand les biens de la collecte des modifications (ajout/suppression d'éléments de la liste fonctionne très bien):
listbox a mis en ItemsSource="{Binding Path=AllPerson}"
et de contexte de données dans le code derrière est définie comme ce this.DataContext = allPersonClass;
.
allPersonClass
contient ObservableCollection<Person> allPerson
Classe Person
contient des propriétés comme le Nom etc.
J'ai écrasé personne ToString
méthode pour retourner Name
bien listBox affiche des données valides
J'ai essayé de faire Person
mettre en œuvre INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void onPropertyChanged(object sender, string propertyName) {
if (this.PropertyChanged != null) {
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
}
public string Name {
get { return name; }
set {
name = value;
onPropertyChanged(this, "allPersonClass");
}
}
et dans tous les biens setter a onPropertyChanged(this, "propertyName");
qui est exécuté mais listBox jamais les mises à jour déjà créé élément
Aucune idée de ce qui pourrait être mauvais?
ici est une fenêtre avec une zone de liste xaml
<Button x:Name="btnDetail" Content="Detail" HorizontalAlignment="Left" Margin="361,249,0,0" VerticalAlignment="Top" Width="75" Click="ButtonDetailClick"/>
<ListBox x:Name="listPerson" ItemsSource="{Binding Path=AllPerson}" HorizontalAlignment="Left" Height="170" Margin="33,29,0,0" VerticalAlignment="Top" Width="155" IsSynchronizedWithCurrentItem="True"/>
<Button x:Name="btnLoad" Content="Load" HorizontalAlignment="Left" Margin="58,249,0,0" VerticalAlignment="Top" Width="75" Click="btnLoad_Click"/>
<Button x:Name="btnSave" Content="Save" HorizontalAlignment="Left" Margin="138,249,0,0" VerticalAlignment="Top" Width="75" Click="ButtonSaveClick"/>
c'est la partie de la fenêtre detravail de la fenêtre lorsque des modifications sont apportées (lié à la Personne)
<TextBox Text="{Binding Path=Name}" Height="23" HorizontalAlignment="Left" Margin="118,20,0,0" Name="txtName" VerticalAlignment="Top" Width="141" />
ici est la partie AllPersonClass:
public class AllPersonClass {
private ObservableCollection<Person> allPerson;
public AllPersonClass() {
allPerson = new ObservableCollection<Person>();
}
public ObservableCollection<Person> AllPerson {
get { return allPerson; }
set { allPerson = value; }
}
public void addPerson(Person newPerson) {
allPerson.Add(newPerson);
}
public Person getPerson(int personIndex) {
return allPerson[personIndex];
}
}
MODIFIER
voici la partie pertinente de la méthode pour enregistrer les modifications en vue de détail
private void OnBtnSaveClick(object sender, RoutedEventArgs e) {
person.Name = txtName.Text;
person.SurName = txtSurName.Text;
}
noter que des modifications sont apportées dans ObservableCollection allPerson seule zone de liste continue de s'afficher des données anciennes
Fournir la mise en oeuvre de votre classe
allPersonClass
je pense que j'ai besoin de dormir, alors je vais le regarder et poster mon avancement
ok bonne nuit 🙂
Cette Propriété a été Modifiée éleveur m'a donné des tic nerveux. Heureusement au moins une réponse adresses.
OriginalL'auteur Abdul | 2013-03-13
Vous devez vous connecter pour publier un commentaire.
Si vous voulez de l'INTERFACE utilisateur pour mettre à jour lorsque vous apportez des modifications à Personne, vous aurez à notifiy que cette propriété a changé, pas la classe
Devrait être
Et vous n'avez pas à remplacer
ToString()
sur lePerson
modèle pour afficher correctement dans votreListBox
, vous pouvez définir laListBox
DisplayMemberPath
pour montrer la propriété que vous voulez dans laListBox
Edit: pour répondre à votre question:
allPerson
ou la propriétéAllPerson
pour ajouter et supprimer des personnes à cause de ses la même référence. Les Notifications sont soulevées par l'ObservableCollection et non par la propriété AllPersonHmmm.. je me souviens d'avoir des ennuis avec ce sujet il y a 3 ans et c'était la seule réponse que j'ai trouvé pour le fixer, j'ai coincé à cette méthode depuis. Je viens de tester et en effet, vous êtes correct, maintenant, je veux aller voir le plus .NET cadres pour voir si je peux reproduire mon vieux problème :), Merci pour le heads up, je vais l'enlever de ma réponse afin de ne pas causer de la confusion.
Cela aide un peu, mais ne me donne pas ce que je veux: avec DisplayMemberPath="Nom", il fonctionne très bien, mais montre seulement le Nom dans ma liste (et les mises à jour correctement après que les modifications). Lorsque j'essaie d'afficher plus d'info comme listPerson.DisplayMemberPath = "Afficher"; où l'Affichage est la propriété de Personne et retuns Nom + "" + Nom de famille, il ne fonctionne pas encore
Assurez-vous que si vous modifiez les propriétés utilisées dans
Display
que vous appelezonPropertyChanged(this, "Display");
, vous avez à dire à l'INTERFACE de la propriété a changé, donc dansName
etSurname
vous appelezonPropertyChanged
deux fois, une fois pour la propriété, une fois pourDisplay
Ajout d'un exemple de réponse
OriginalL'auteur sa_ddam213
Dans votre fenêtre detravail que vous devez définir un TwoWay de Liaison pour mettre à jour le Nom de la Propriété de votre
person
classe.Aussi, si vous souhaitez mettre à jour la propriété chaque fois que le texte est écrit, vous devez également définir la
UpdateSourceTrigger
avecPropertyChanged
. Autrement, c'est la propriété de mettre à jour uniquement lorsque la zone de texte perd le focus.OriginalL'auteur Jehof
votre problème, c'est que votre collection n'êtes jamais à Notifed sur votre PropertyChanged
cela devrait vous aider à
voir aussi ce Lien
peut-être que ce nuage aussi vous aider [LIEN] (stackoverflow.com/questions/4588359/...)
Vous n'êtes pas à vous désabonner des événements.
qui sur le CollectionChanged? Ses juste pour montrer qu'il a besoin de se lier à cet Événement, comment mettre en œuvre cette inscription et unsubscribtion sera une partie de son code
ok, très bien
OriginalL'auteur WiiMaxx
Je pense que vous pourriez vouloir examiner la façon dont vous êtes en train de faire la liaison au niveau de l'élément. Consultez ce lien, il vous permettra de commencer:
Comment faire pour déterminer si une ligne dans ObservableCollection<T> en fait changé
OriginalL'auteur code4life