Autor Beitrag
Määx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Di 22.07.14 16:28 
Hallo zusammen,

ich habe einen ItemsControl, dessen ItemSource-Eigenschaft an eine ObservableCollection gebunden ist. Wenn ich nun während de rLaufzeit aus einem Thread der Collection ein Item hinzuufüge, erhalte ich eine Fehlermelduing (im Prinziop ungültiger Threadübergreifender vorgang). Also habe ich wie bei WinForms eine Art invoke in meine ViewModelBaseClass eingebaut:
ausblenden C#-Quelltext
1:
2:
3:
4:
public virtual Dispatcher DispatcherObject { get; protected set; }
protected VieModelBaseClass(){
DispatcherObject = Dispatcher.CurrentDispatcher;
}

Wenn ich nun ein Element hinzufügen will muss ich eine spezielle Methode aufrufen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void AddItem(Item item)
{            
  if (DispatcherObject.Thread != System.Threading.Thread.CurrentThread)
  {
    DispatcherObject.Invoke(new Action(() => AddItem(item)));
    return;
  }
  ItemCollection.Add(item);
 }


Das klappt jetzt auch erstmal ganz gut. Aber nun ist es so, dass ein hinzugefügtes Item wiederum ein ItemsControl mit ItemSource-Bindung an eine Collection<SubItem> in dem Item hat. Füre ich ein
item.SubItemCollection.Add(subItem) aus, kommt logischerweise wieder die Fehlermeldung. Führe ich in der Item-Klasse einen ähnlichen Code aus wie oben, so erhalte ich zwar keinen Fehler, ich bekomme aber auch keine Veränderung der GUI.
Erst wenn ich in meiner Main-Class ein invoke aufrufe erhalte ich das gewünschte Ergebnis:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void AddSubItem(Item item, SubItem subItem)
{
  if (DispatcherObject.Thread != System.Threading.Thread.CurrentThread)
  {
    DispatcherObject.Invoke(new Action(() => AddSubItem(item, subItem)));
    return;
  }
  item.SubItemsCollection.Add(subItem);
}


Also muss ich immer auf das dispatcherObjekt der GUI-Klass zurückgreifen. Kann man das irgendwie vereinfachen oder muss ich jetzt meinem ViewModelBaseClass das DispatcherObjekt durchreichen?
Kann man die Add-Methode der ObservableCollection so überschreiben, dass sie direkt das invoke ausführt?

Vielen Dank
Määx