Moinmoin,
grundsätzlich kann man über die Eigenschaft "CanUserAddRow" das Grid in den Einfügemodus schalten. Und dann gibt es auch noch das Event "InitializingNewItem", in dem man ein neues Listenelement initialisieren soll. Dies funktioniert auch grundsätzlich, aber in folgenden Szenario bietet es nicht genügend Eingriffsmöglichkeiten.
Zum Zeitpunkt des Events "InitializingNewItem" ist das Element der neuen Zeile (z.B. Typ Adresse) bereits mittels des Default-Knostruktors erzeugt wurden.
Das Neuanlegen eines neuen Elements erfolgt immer über eine New-Methode:
[highlight=c#]class BSO
{
Adress _CurrentAdresse;
List<Adresse> _AdressList;
void NewAdresse()
{
if(!PreExecute("NewAdresse")
return;
Adress adresse = new Adresse();
adresse.Nr = Guid.NewId();
_CurrentAdresse = adresse;
_AdressList.Add(adresse);
// Ist abstrakter gelöst, da die Klasse, die Oberfläche nicht kennt.
ucDatagrid.DataContext = null;
ucDatagrid.DataContext = this;
}
}[/highlight]
Nun zum eigentlichen Szenario...
Die konkrete WPF-Oberfläche ist der Klasse nicht direkt bekannt. So kann mittels WPF-XAML wahlweise ein Datagrid mit der Liste von Adressen (_AdressList) oder einzelne Steuerelemente mit der der aktuellen Adresse (_CurrentAdresse) oder eine Kombination von Readonly-DataGrid und Steuerelementen dargestellt werden.
Das PreExecute ermöglicht eine kundenspezifische Implementierung von NewAdresse, welche dann selbst die Erzeugung und Initialisierung übernehmen kann.
Hier nun das Problem:
Beim "InitializingNewItem" kann ich die Funktion nicht aufrufen, da ja schon die neue Instanz von Adresse erzeugt wurde. Hier bräuchte man ein anderes Event vom DataGrid (wie z.B. OnCreateNewItem), das vor dem "InitializingNewItem" aufgerufen wird und wo dann die in meinem Fall die "NewAdresse()" aufgerufen werden könnte.
Folgendes habe ich schon probiert...
Beim DataGrid habe ich das "PreviewKeyDown" Event abgefangen und falls in der letzten Zeile Pfeil runter (Key.Down) gedrückt wird, dann rufe ich die NewAdresse Methode auf. Dies funktioniert grundsätzlich auch, nur es ist mir noch nicht gelungen, den Focus auf die neue Zeile bzw. die erste Spalte der neuen Zeile zu setzen...
[highlight=c#]ucGrid.DataContext = null;
ucGrid.DataContext = BSO;
ICollectionView collView = CollectionViewSource.GetDefaultView(ucGrid.ItemsSo urce);
if (collView != null)
{
collView.MoveCurrentToLast();
}[/highlight]
..dies funktioniert leider nicht. Da der Code im Callstack vom PreviewKeyDown des DataGrid aufgerufen wird.
Hat jemand eine Idee ?
Gruß
Norbert
grundsätzlich kann man über die Eigenschaft "CanUserAddRow" das Grid in den Einfügemodus schalten. Und dann gibt es auch noch das Event "InitializingNewItem", in dem man ein neues Listenelement initialisieren soll. Dies funktioniert auch grundsätzlich, aber in folgenden Szenario bietet es nicht genügend Eingriffsmöglichkeiten.
Zum Zeitpunkt des Events "InitializingNewItem" ist das Element der neuen Zeile (z.B. Typ Adresse) bereits mittels des Default-Knostruktors erzeugt wurden.
Das Neuanlegen eines neuen Elements erfolgt immer über eine New-Methode:
[highlight=c#]class BSO
{
Adress _CurrentAdresse;
List<Adresse> _AdressList;
void NewAdresse()
{
if(!PreExecute("NewAdresse")
return;
Adress adresse = new Adresse();
adresse.Nr = Guid.NewId();
_CurrentAdresse = adresse;
_AdressList.Add(adresse);
// Ist abstrakter gelöst, da die Klasse, die Oberfläche nicht kennt.
ucDatagrid.DataContext = null;
ucDatagrid.DataContext = this;
}
}[/highlight]
Nun zum eigentlichen Szenario...
Die konkrete WPF-Oberfläche ist der Klasse nicht direkt bekannt. So kann mittels WPF-XAML wahlweise ein Datagrid mit der Liste von Adressen (_AdressList) oder einzelne Steuerelemente mit der der aktuellen Adresse (_CurrentAdresse) oder eine Kombination von Readonly-DataGrid und Steuerelementen dargestellt werden.
Das PreExecute ermöglicht eine kundenspezifische Implementierung von NewAdresse, welche dann selbst die Erzeugung und Initialisierung übernehmen kann.
Hier nun das Problem:
Beim "InitializingNewItem" kann ich die Funktion nicht aufrufen, da ja schon die neue Instanz von Adresse erzeugt wurde. Hier bräuchte man ein anderes Event vom DataGrid (wie z.B. OnCreateNewItem), das vor dem "InitializingNewItem" aufgerufen wird und wo dann die in meinem Fall die "NewAdresse()" aufgerufen werden könnte.
Folgendes habe ich schon probiert...
Beim DataGrid habe ich das "PreviewKeyDown" Event abgefangen und falls in der letzten Zeile Pfeil runter (Key.Down) gedrückt wird, dann rufe ich die NewAdresse Methode auf. Dies funktioniert grundsätzlich auch, nur es ist mir noch nicht gelungen, den Focus auf die neue Zeile bzw. die erste Spalte der neuen Zeile zu setzen...
[highlight=c#]ucGrid.DataContext = null;
ucGrid.DataContext = BSO;
ICollectionView collView = CollectionViewSource.GetDefaultView(ucGrid.ItemsSo urce);
if (collView != null)
{
collView.MoveCurrentToLast();
}[/highlight]
..dies funktioniert leider nicht. Da der Code im Callstack vom PreviewKeyDown des DataGrid aufgerufen wird.
Hat jemand eine Idee ?
Gruß
Norbert
Comment