ListBox-Elements nicht aktualisiert, wenn die Eigenschaft geändert hat
Problem habe ich die Aktualisierung Listbox mit ObservableCollection als property der collection ändert (hinzufügen/entfernen von Elementen aus der Liste, funktioniert einwandfrei):
listbox gesetzt hat ItemsSource="{Binding Path=AllPerson}"
- und Daten-Kontext in den code-behind festgelegt ist, wie dies this.DataContext = allPersonClass;
.
allPersonClass
enthält ObservableCollection<Person> allPerson
Klasse Person
enthält Eigenschaften wie Name etc.
Habe ich überschrieben person ToString
Methode zurück Name
Eigenschaft in listBox zeigt gültige Daten
Ich habe versucht, die Person
implementieren 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");
}
}
und in jeder Eigenschaft setter hat onPropertyChanged(this, "propertyName");
ausgeführt wird, aber listBox nie updates bereits erstellten Element
Irgendeine Idee was falsch sein könnte?
hier ist Fenster xaml-Code mit listBox
<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"/>
dies ist Teil der Detailansicht-Fenster, in dem änderungen vorgenommen werden (der gebundenen Person)
<TextBox Text="{Binding Path=Name}" Height="23" HorizontalAlignment="Left" Margin="118,20,0,0" Name="txtName" VerticalAlignment="Top" Width="141" />
hier ist Teil 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];
}
}
BEARBEITEN
hier ist der relevante Teil der Methode, um die änderungen zu speichern in der Detailansicht
private void OnBtnSaveClick(object sender, RoutedEventArgs e) {
person.Name = txtName.Text;
person.SurName = txtSurName.Text;
}
beachten Sie, dass änderungen in der ObservableCollection allPerson nur listBox zeigt alte Daten
- Hier zu helfen, solltest du post haben-ein Beispiel von Xaml und eine Probe von der ViewModel-Implementierung zeigt den property change notification.
- Unterstützen die Implementierung der Klasse
allPersonClass
- ich glaube, ich brauche etwas Schlaf, dann werde ich das prüfen und meine Fortschritte posten
- okay, gute Nacht 🙂
- Diese Eigenschaft Geändert raiser gab mich nervös zucken. Zum Glück wenigstens eine Antwort-Adressen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass die Benutzeroberfläche zu aktualisieren, wenn Sie änderungen an eine Person, die Eigenschaften, die Sie haben, um notifiy, dass die Eigenschaft geändert hat, nicht die Klasse
Sollte
Und Sie nicht zu überschreiben
ToString()
auf diePerson
Modell zu zeigen, richtig in IhremListBox
können Sie dieListBox
DisplayMemberPath
zu zeigen, die Immobilie, die Sie wollen in derListBox
Edit: zur Beantwortung deiner Kommentar-Frage:
allPerson
oder die EigenschaftAllPerson
hinzufügen und entfernen von Personen verursachen, die die gleiche Referenz. Die Nofications erhoben werden, die von der ObservableCollection und nicht durch die Eigenschaft AllPersonDisplay
dass Sie anrufenonPropertyChanged(this, "Display");
Sie sagen, die UI die Eigenschaft geändert hat, also inName
undSurname
Sie rufenonPropertyChanged
zweimal, einmal für die Eigenschaft, einmal fürDisplay
In Ihrer Detailansicht, die Sie brauchen, um zu definieren, eine TwoWay-Bindung zum aktualisieren der Eigenschaft Name Ihres
person
Klasse.Auch, wenn Sie möchten, aktualisieren Sie die Eigenschaft jedes mal, wenn text geschrieben wird, müssen Sie auch definieren, die
UpdateSourceTrigger
mitPropertyChanged
. Ansonsten ist das Hotel nur aktualisiert, wenn das Textfeld den Fokus verliert.dein problem ist, dass Ihre Sammlung sich noch nie Notifed über Ihre PropertyChanged
dies sollte Ihnen helfen,
siehe auch diese Link
Ich denke, möchten Sie vielleicht, um zu überprüfen, wie Sie tun, die Bindung an die item-Ebene. Überprüfen Sie heraus diesen link, wird es Sie loslegen können:
Wie zu bestimmen, ob eine Zeile in der ObservableCollection - <T> wirklich geändert