Laden...

[gelöst] ListView an ObservableCollection binden funktioniert nur ohne DisplayMemberPath

Erstellt von Hobby Programmierer vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.123 Views
H
Hobby Programmierer Themenstarter:in
18 Beiträge seit 2011
vor 10 Jahren
[gelöst] ListView an ObservableCollection binden funktioniert nur ohne DisplayMemberPath

Hallo,

wie im Titel schon angedeutet, versuche ich eine ListView an eine ObservableCollection zu binden.
Folgendermaßen funktioniert es auch:


ObservableCollection<Karte> Liste = new ObservableCollection();
public MainWindow()
{
   InitializeComponent();
            
   this.DataContext = Liste;
   Liste.Add(new Karte());
}


<ListBox ItemsSource="{Binding}" Grid.Column="0"/>

Da ich die ToString-Methode nicht überschrieben habe, erscheint auf diese Weise nur Namespace.Klassenname in der ListView.

Die Klasse Karte hat aber auch das Feld Name vom Typ string, und genau dieser String sollte in der ListView stehen.
Dann schreibe ich also im XAML:


<ListBox ItemsSource="{Binding}" DisplayMemberPath="Name" Grid.Column="0"/>

Und jetzt steht auf einmal nichts mehr in der Listview obwohl Name etwas enthält. Mein einziger Ansatzpunkt ist dieser Text in der Debug Ausgabe: > Fehlermeldung:

System.Windows.Data Error: 40 : BindingExpression path error: 'Name' property not found on 'object' ''Karte' (HashCode=37504295)'. BindingExpression:Path=Name; DataItem='Karte' (HashCode=37504295); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

Name ist allerdings richtig geschrieben und öffentlich.

Vielen Dank im Voraus
Hobby Programmierer

849 Beiträge seit 2006
vor 10 Jahren

das Feld Name vom Typ string

Binden kannst Du nur public Propertys

Grüße

H
Hobby Programmierer Themenstarter:in
18 Beiträge seit 2011
vor 10 Jahren

Vielen Dank, so funktioniert es, wenn ich den String gekapselt habe.

Das war aber nur aus Testgründen so, dass direkt an die ObservableCollection gebunden wird. 😉

Eigentlich soll an die Klasse Spiel gebunden werden,
die wieder das öffentliche Feld Spieler enthält, 1. Kann man Klassen kapseln, damit sie eine Property sind?
und erst dieser Spieler enthält dann die ObservableCollection. 2. Die ObservableCollection darf doch ein öffentliches Feld sein, oder?

Grüße im Voraus
Hobby Programmierer

849 Beiträge seit 2006
vor 10 Jahren

Wenn Du Spiel als DataContext nimmst, kannst Du dann mit {Binding Spieler.Liste} auf deine ObservableCollection (wobei Liste ein Proberty ind der Klasse Spieler ist).

Alles was Du bindest muss ein Property sein. In diesem Zusammenhang solltest Du dir auch einmal die impl. von INotifyPropertyChanged angucken.

H
Hobby Programmierer Themenstarter:in
18 Beiträge seit 2011
vor 10 Jahren

Nochmals Danke, nun habe ich es gelöst.

Ich dachte immer, ich könnte Klassen und Collections nur als Felder machen, und wusste nicht wie ich sie "explizit" kapseln könnte. Nun ist mir aufgefallen, dass es mit

{get; set;}

funktioniert. Ich muss einfach alles, was in dem Pfad zur Property auftritt, zu einer Property machen.

Grüße
HobbyProgrammierer

PS: INotifyPropertyChanged habe ich mir schon angeschaut 🙂