Autor Beitrag
Biplane
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 05.01.10 10:46 
Moinmoin,

in meiner Anwendung möchte ich die Oberfläche und die Businessschicht möglichst gut trennen, damit das Layout später beliebig Customized werden kann. Dies funktioniert auch schon zu 95%.

Das letzte Problem ist jetzt noch das editierbare DataGrid, bei dem die Logik der ObservableCollection ein erhebliches Problem erzeugt.

Hier mal die Relevanten Codestellen...

ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
public class BSOAdressen
{
    public BSOAdressen()
  {
  }

    // Liste der Adressen, wird mittels Linq-Statement (EntityFrameWork) bereitgestellt
    public ObservableCollection<Adresse> AdressList {get;}
    // Aktuell zu bearbeitende Adresse
    public Adresse CurrentAdresse { get; set; }
    // Aktuell im DataGrid selektierte Adresse
    public Adresse SelectedAdresse { get; set; }

    // Ist nur verfügbar, wenn IsEnabledNewAdresse == True ist
    void NewAdresse()
    {
        // Neue Instanz anlegen
        Adresse adresse = new Adresse();
        // Versorgen mit Defaultwerten und evtl. weitere Programmlogik
        adresse.Land = "BRD";
        AdressList.Add(adresse);
        CurrentAdresse = adresse;
    }

    bool IsEnabledNewAdresse { get; }

    // Ist nur verfügbar, wenn IsEnabledDeleteAdresse == True ist
    void DeleteAdresse()
    {
        // Löschen aus Liste. 
        AdressList.Remove(CurrentAdresse);
    }

    bool IsEnabledDeleteAdresse { get; }
}


public class MyCollection<T> : ObservableCollection<T>
{
    public MyCollection(IQueryable<T> liste)
        : base(liste)
    { }

    protected override void InsertItem(int index, T item)
    {
        // Hier ist beim einfügen im DataGrid (CanUserAddRows=True)
        // bereits die neue Instanz mittels des Default-Konstruktors von "Addresse"
        // erzeugt wurden. 
        // !!! Besser wäre, wenn die Möglichkeit bestünde "NewAdresse" manuell aufzurufen !!! Funzt aber nicht
        base.InsertItem(index, item);
    }

    protected override void RemoveItem(int index)
    {
        base.RemoveItem(index);
    }

}



Das Problem besteht in den zwei unterschiedlichen Anforderungen entsprechend des Maskenlayouts:
1. Readonly DataGrid und einzelne Eingabefelder für die zu bearbeitende (neue) Adresse
Der ItemsSource vom DataGrid ist mit "AdressList" gebunden. Wird eine Zeile im DataGrid ausgewählt, wird die "SelectedAdresse" gesetzt. Beim DblClick wird eine Load-Methode (hier nicht aufgeführt) aufgerufen, welche "CurrentAdresse=SelectedAdresse;" ausführt.

Zum Neuanlegen einer Adresse wird die Methode "NewAdresse" benötigt.

2. Editierbares DataGrid
Beim editierbaren Grid sind CurrentAdresse und SelectedAdresse immer automatisch synchronisiert. Es wird immer eine leer neue Zeile unten im DataGrid angezeigt. Wird in diese Zeile etwas eingeben, erfolgt ein Aufruf von ("InsertItem" bei der ObservableCollection). Zu diesem Zeitpunkt ist aber bereits eine Instanz von Adresse erzeugt wurden. Es besteht also nicht die Möglichkeit, die Methode "NewAdresse" aufzurufen, um die eigene Programmlogik aufrecht zu erhalten.

Grundsätzlich funktioniert es auch schon das abhäng vom Rückgabewert von "IsEnabledNewAdresse" die neue Zeile angezeigt wird. Also schon nicht schlecht die Möglichkeiten der WPF.

Gibt es ein Event oder virtuelle Methode, wo man sich vor der Erzeugung der neuen Instanz "Adresse" reinhängen kann, um dann manuell "NewAdresse" aufrufen zu können ?


Gruß
Norbert

Moderiert von user profile iconKha: C#-Tags hinzugefügt