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



BeitragVerfasst: Mo 25.03.13 20:13 
Hallo zusammen,

ich stehe vor folgendem Problem:
Ich habe verschiedene UserControl, die diverse Daten darstellen. Für ein UserControl habe ich nun das gesamte DataBinding mit eigenem Eventing geschreiben und es funktioniert auch wunderbar.
Für jeden möglichen anzuzeigenden Parameter gibt es einen Eintrag in einem Dictonary, der aus der ID und einer BindingList mit den Werten zu verschiedenen Zeitpunkten besteht. Je nach UserControl fange ich die zugehörigen ListChangedEvents ab. Welche dies sind regel ich je UserControl über eine Liste, in dem die benötigten ParameterIDs stehen.
Da nicht immer alle Parameter in dem Dictonary vorkommen müssen, werden die Bindungen zur Laufzeit dynamisch erstellt. Hierzu wurde das Dictonary um ein Eventing erweitert, dass mir mitteilt, wenn ein neuer Eintrag hinzugefügt wird.

Das funktioniert jetzt wie gesagt in einem UserControl wunderbar. Also dachte ich mir, es wäre ja sinnvoll die gesamte Funktionalität der Bindung in eine Klasse auszulagern und dann in den jeweiligen Controls nur die ParameterID-Liste anzupassen und natürlich die Funktion zu überschreiben, die dann die GUI-Elemente befüllt.

Lagere ich das ganze aber aus, so werden meine DataBindings nicht mehr durchgeführt.

Hier noch die -wie ich glaube- wichtigsten Code-Zeilen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
private List<int> parameterIDs = new List<int>();

public void init(Person person){
    fillParameterIDs(); // <- muss entsprechend überschrieben werden
    person.newParameterIDAdded += new Person.ParameterIDAddedEventHandler(parameterIDAdded);
    loadData();         // <- hier werden die GUI-Elemente bestückt. Diese Methode muss also ebenfalls überschireben werden
}

private void parameterIDAdded(int newParameterID, BindingList<Parameter> valueList){
    if( parameterIDs.Contains( newParameterID) ){
         person.addParameterBinding( newParameterID, new ListChangedEventHandler(paramvalueAdded));
    }
}
private void paramvalueAdded(object sender, ListChangedEventArgs e)
{
  if (e.ListChangedType == ListChangedType.ItemAdded)
  {
      //Zu dem relevanten Parametern wurde ein neuer Wert hinzugefügt
      BindingList<Parameter> paramvalueList = (BindingList<Parameter>)sender;
      Parameter param = paramvalueList[e.NewIndex];
      loadData( param );  // <- wird ebenfalls überschireben um die GUI-Elemente anzupassen
   }
}

Und in der Klasse Person ist das hinzufügen der Bindung wie folgt implementiert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public void addParameterBinding(int paramID, ListChangedEventHandler handler)
{
    if (_Parameters.ContainsKey(paramID))
    {
        _Parameters[paramID].ListChanged += handler;
     }
}


Irgendwie lässt sich das so also nicht vererben? Kann das seiin, oder mache ich einfach irgendetwas falsch? Und kann man eine Methode markieren, dass sie im Falle einer vererbung überschrieben werden muss?

Vielen Dank für eure Hilfe
Määx

EDIT: ok, habs gelöst - hatte scheinbar irgendwelche Pointer falsch übergeben und dadurch ist dann alles schief gelaufen.