/ / ListView Inserire un nuovo elemento su TAB - wpf, listview, keydown

ListView Inserire un nuovo elemento su TAB - wpf, listview, keydown

Avere un ListView WPF con elementi associati a un datooggetto e rappresentato da editor (testo, data, ecc.). Vorrei poter inserire un nuovo elemento quando gli utenti si trovano nell'ultimo editor dell'ultimo elemento e preme TAB. Quindi, dopo aver impostato l'input focus sul primo editor dell'elemento appena aggiunto.

Finora ho questo:

private Boolean _tabAddedNewSpec = false;
private void OnBaseEditKeyDown(object sender, KeyEventArgs e)
{
if (!_tabAddedNewSpec)
{

if (e.Key == Key.Tab)
if (this.listview.SelectedItem == this.listview.Items[this.listview.Items.Count - 1])
{
this.AddSpec();

// No further tabbing out of this control, we manage it ourselves in this special case...
e.Handled = true;
_tabAddedNewSpec = true;

// Select last item (is NEW one)
this.listview.SelectedItem = this.listview.Items[this.listview.Items.Count - 1];

}
}
}
private void OnBaseEditKeyUp(object sender, KeyEventArgs e)
{
if (_tabAddedNewSpec)
{
((BaseEdit)sender).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
_tabAddedNewSpec = false;
}
}

Questo codice fa quasi il trucco. Ma, non permetto che venga aggiunta una specifica (specifica) quando ci sono altre specifiche che contengono errori di validazione (sull'oggetto business). Il problema è che quando si preme TAB il valore di modifica sull'ultimo editor non è ancora passato a l'oggetto aziendale. Quindi quando si chiama this.AddSpec () non produce nulla perché rileva che ci sono ancora errori. Seguimi ancora ...

E a proposito, questa soluzione mi sembra abbastanza sporca. Qualcuno di buon consiglio? Piu che benvenuto!

risposte:

0 per risposta № 1

Come accennato prima, la soluzione ha quasi fatto il trucco. Con il primo aggiornamento del legame del controllo attivo è stata prodotta la soluzione desiderata. Utilizzando questo codice:

BindingExpression bindingExpression = ((BaseEdit)sender).GetBindingExpression(TextEdit.TextProperty);

if (bindingExpression != null)
bindingExpression.UpdateSource();