Laden...

ItemsSource updaten

Letzter Beitrag vor 13 Jahren 8 Posts 1.757 Views
ItemsSource updaten

Hallo,

ich habe gerade ein Problem mit der ItemsSource einer ComboBox.
Diese ist per Binding an eine ObservableCollection (namens _source) gebunden. Wenn ich diese nun updaten will (_source.Clear() und dann wieder neu füllen), dann klappt das Binding der ComboBox nicht mehr, d.h. das nach dem Update die ComboBox nichts mehr anzeigt.

Daher meine Frage, wie updatet man eine ItemsSource richtig?

Viele Grüße
Quaneu

Hallo Quaneu,

normalerweise macht ein coll.Clear() keine Probleme. Das bekommt die GUI schon mit, und auch dann coll.Add() funktioniert problemlos. Hast du vielleicht irgendwo die Collection neu initialisiert, denn dann wird das Binding gelöst?

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

"Leider" nicht, sie wird im Konstruktor angelegt und dann nur noch manipuliert. Daher wundert es mich ja so.
Das einzige wie ich es mir erklären kann, ist dass er per Binding das Objekt in der ComboBox auswählt, dann lösche ich aber das Objekt aus der ComboBox (per Clear()) und dann fülle ich sie wieder und wahrscheinlich wählt er danach nicht noch einmal das Objekt aus.

Hallo Quaneu,

löschst du die Elemente in der Combobox? Wenn ja dann könnte das das Problem auslösen.

Lösche die Dinger immer nur direkt in der ObservableCollection dann muss das auch funktionieren

Gruss
Michael

Gelöscht werden nur die Objekte in der ObservableCollection. Der Update wird immer im OnLoad des UserControls ausgeführt.

Hallo,

ich mach das immer so und es funktioniert ohne Probleme.
Erstelle mal einen minimalen Beispielcode dann sag ich dir was daran falsch ist, denn so ist es nur ein Rätselraten 😃

Gruss
Michael

Ein Beispiel ist recht leicht anzugeben:


<ComboBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding ElementName=_conversionView, Path=AvailableUnits}" SelectedItem="{Binding ElementName=_dataGrid,Path=SelectedItem.Unit}" SelectionChanged="OnUnitSelectionChanged"  Margin="2"/>


private static readonly DependencyProperty AvailableUnitsProperty = DependencyProperty.Register("AvailableUnits", typeof(ObservableCollection<ARUnit>), typeof(ConversionView), new PropertyMetadata(new ObservableCollection<ARUnit>()));

public ObservableCollection<ARUnit> AvailableUnits
{
   get
   {
       return (ObservableCollection<ARUnit>)GetValue(AvailableUnitsProperty);
   }
   set
   {
       SetValue(AvailableUnitsProperty, value);
   }
}


private void OnLoaded(object sender, RoutedEventArgs e)
{
   AvailableUnits.Clear();
   App.ARManager.GetAllUnits().ForEach(x => AvailableUnits.Add(x));
}


 


Also erstens mal was zum Loaded Event. Das wird bei der ersten Erzeugung des Objektes gefeuert, was soviel bedeutet, dass bei jedem Aufruf von Loaded du dich in einem neuen Objekt befindest.

In WPF werden die GUI Elemente erzeugt, wenn sie angezeigt werden und auch wieder verworfen, wenn sie nicht mehr gebraucht werden.(Beispiel TabControl - wenn du durch die Tabs schaltest und in jedem Tabitem ein UserControl liegt, wird jedes UserControl neu erzeugt wenn man wieder dorthin navigiert). Insofern eignet sich ein Frameworkelement nicht wirklich zum Halten von Daten.

Falls dir MVVM noch kein Begriff ist dann lies dich da mal rein denn damit kann dir sowas nicht passieren.

Lg XXX