Hallo zusammen folgende Problemstellung:
Ich habe 2 Comboboxen. Auf der ersten Combobox wird etwas ausgewählt und abhängig von dem
Ich interpretiere, dass die gebundene
Ein weiteres Problem besteht nun, wenn die ObservableCollection für die 2. Combobox viele Items enthält, gibt's es auch im Release Built massive Verzögerungen. Bei 2500 Items knapp ca. 2 Sekunden, was ich schon als Einschränkung empfinde.
Ein kurzes abgespecktes, wahrscheinlich nicht lauffähiges Beispiel zur Veranschaulichung:
Besitzt nun ein gewisses SelectedLand.Städte viele Einträge dauert es die angesprochene Zeit bis die 2. Combobox ansprechbar ist. Wechsele ich nun das Land tritt der og. Bindingfehler auf und es dauert wieder seine Zeit.
Edit: Das Problem ist im Netz bekannt und es wird geraten mit einem VirtualizingPanel für die Combobox zu arbeiten. Das ist NICHT die Lösung. Im Debugmodus sieht man, dass ein Haufen neuer Arbeitsspeicher benötigt wird sobald man die ItemsSource ändert. Es werden also ALLE Combobox-Items neu generiert und nicht nur die sichtbaren
Edit 2: Ich sehe gerade, dass jemand exakt das Beispiel in c# erklärt hat social.technet.microsoft.com/w…es-in-wpf-using-mvvm.aspx. Auch dort tritt das Problem auf.
Edit 3: Wenn man explizit das Alignment setzt tritt der Fehler nicht mehr auf!!!
Allerdings ist die Geschwindigkeit immer noch nicht überzeugend bzw. hat sich nicht geändert
Ich habe 2 Comboboxen. Auf der ersten Combobox wird etwas ausgewählt und abhängig von dem
SelectedItem
soll die 2. Combobox gefüllt werden. Funktioniert. Wenn ich jetzt aber die Auswahl in der ersten Combobox ändere also das Binding der 2. Combobox auf eine andere ItemsSource setze tritt folgender Bindingfehler auf und zwar in der Anzahl wie die zweite Combobox Items hatte:System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')
Ich interpretiere, dass die gebundene
ObservableCollection
der 2. Combobox verändert wird, ohne dass die ComboBoxItems darüber informiert werden und jetzt versucht WPF verzweifelt die Items anzuordnen. Ist eigentlich kein Problem, es funktioniert immer noch alles wie es soll, außer dass mein Ausgabefenster zugespammt wird . Kann trotzdem jemand bei diesem BindingFehler helfen?Ein weiteres Problem besteht nun, wenn die ObservableCollection für die 2. Combobox viele Items enthält, gibt's es auch im Release Built massive Verzögerungen. Bei 2500 Items knapp ca. 2 Sekunden, was ich schon als Einschränkung empfinde.
Ein kurzes abgespecktes, wahrscheinlich nicht lauffähiges Beispiel zur Veranschaulichung:
XML-Quellcode
- <Grid>
- <ComboBox Margin="2" ItemsSource="{Binding Länder}" SelectedItem="{Binding SelectedLand}" >
- <ComboBox.ItemTemplate>
- <DataTemplate DataType="Land">
- <TextBlock Margin="2, 1" Text="{Binding Name}"/>
- </DataTemplate>
- </ComboBox.ItemTemplate>
- </ComboBox>
- <ComboBox ItemsSource="{Binding SelectedLand.Städte}" SelectedItem="{Binding SelectedStadt}">
- <ComboBox.ItemTemplate>
- <DataTemplate DataType="Stadt">
- <TextBlock Margin="2, 1" Text="{Binding Name}"/>
- </DataTemplate>
- </ComboBox.ItemTemplate>
- </ComboBox>
- </Grid>
VB.NET-Quellcode
- Public Class LänderViewModel
- Private _Länder As New ObservableCollection(Of Land)
- Public Property Länder As ObservableCollection(Of Land)
- Get
- Return _Länder
- End Get
- Set(value As ObservableCollection(Of Land))
- _Länder = value
- RaisePropertyChanged("Länder")
- End Set
- End Property
- Private _selectedLand As Land
- Public Property SelectedLand As Land
- Get
- Return _selectedLand
- End Get
- Set(value As Land)
- _selectedLand = value
- RaisePropertyChanged("SelectedLand")
- End Set
- End Property
- End Class
- Public Class Land
- Public Property Name As String
- Private _Städte As New ObservableCollection(Of Stadt)
- Public Property Städte As ObservableCollection(Of Stadt)
- Get
- Return _Städte
- End Get
- Set(value As ObservableCollection(Of Stadt))
- _Städte = value
- RaisePropertyChanged("Städte")
- End Set
- End Property
- Private _selectedStadt As Stadt
- Public Property SelectedStadt As Stadt
- Get
- Return _selectedStadt
- End Get
- Set(value As Stadt)
- _selectedStadt = value
- RaisePropertyChanged("SelectedStadt")
- End Set
- End Property
- End Class
- Public Class Stadt
- Public Property Name
- End Class
Besitzt nun ein gewisses SelectedLand.Städte viele Einträge dauert es die angesprochene Zeit bis die 2. Combobox ansprechbar ist. Wechsele ich nun das Land tritt der og. Bindingfehler auf und es dauert wieder seine Zeit.
Edit: Das Problem ist im Netz bekannt und es wird geraten mit einem VirtualizingPanel für die Combobox zu arbeiten. Das ist NICHT die Lösung. Im Debugmodus sieht man, dass ein Haufen neuer Arbeitsspeicher benötigt wird sobald man die ItemsSource ändert. Es werden also ALLE Combobox-Items neu generiert und nicht nur die sichtbaren
Edit 2: Ich sehe gerade, dass jemand exakt das Beispiel in c# erklärt hat social.technet.microsoft.com/w…es-in-wpf-using-mvvm.aspx. Auch dort tritt das Problem auf.
Edit 3: Wenn man explizit das Alignment setzt tritt der Fehler nicht mehr auf!!!
Allerdings ist die Geschwindigkeit immer noch nicht überzeugend bzw. hat sich nicht geändert
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „SKeks“ ()