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...
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() { }
public ObservableCollection<Adresse> AdressList {get;} public Adresse CurrentAdresse { get; set; } public Adresse SelectedAdresse { get; set; }
void NewAdresse() { Adresse adresse = new Adresse(); adresse.Land = "BRD"; AdressList.Add(adresse); CurrentAdresse = adresse; }
bool IsEnabledNewAdresse { get; }
void DeleteAdresse() { 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) { 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
Kha: C#-Tags hinzugefügt