Domanda

Sto usando un AutoCompleteBox dal WPF Toolkit all'interno modello di modifica di un DataGridTemplateColumn in WPF4. Funziona abbastanza bene per la maggior parte una volta che ho risolto tutti i problemi di legame della fastidiosi intorno vincolante DataGrid e anche propri trucchi e incompletezza di AutoCompleteBox. Fin qui tutto bene. Il problema è la tastiera.

Questo è lo scenario: c'è un DataGrid con due colonne. Il primo è un DataGridTemplateColumn che ha un AutoCompleteBox nel suo modello di editing. Il secondo è solo un DataGridTextColumn ordinario.

Se invoco la modifica di una riga, posso scegliere una voce nel AutoCompleteBox. scheda premere I per passare alla colonna successiva, ma invece la modifica fila viene impegnato, e il fuoco della tastiera non si muove alla colonna successiva. Se questo fosse un DataGridTextColumn, sarebbe rimanere in modalità di modifica e mi permetta di modificare la colonna successiva. Questo avviene anche per le nuove righe.

Secondo me sembra che ci sia qualcosa di sbagliato con cui WPF decide di inviare il focus della tastiera quando si esce dalla Autocompletebox, ma non riesco a capire cosa posso fare a questo proposito, e anche io non sono state in grado di trovare qualcuno parlando lo stesso problema, il che suggerisce sia che sto facendo qualcosa di sbagliato o non interessa a nessuno altro circa la navigazione da tastiera attraverso le loro reti. Sono stato con una sottoclasse TemplateColumn che sostituisce PrepareCellForEditing per garantire le terre di messa a fuoco nella AutoCompleteBox immediatamente la modifica della cella (come da altre risposte qui), ma i persiste problema se rendo invalido tutto ciò che il codice quindi non è un effetto di quel po 'di inganno per quanto posso dire.

Tutte le idee?

Il XAML sembra più o meno come questo (semplificato, naturalmente, la griglia ha molto più di due colonne e alcuni dati piuttosto complicato vincolanti in corso - ho lasciato fuori le associazioni e tenni alla struttura generale) .

<DataGrid>
  <DataGridTemplateColumn Header="AutoCompleteBox">
    <DataGridTemplateColumn.CellTemplate>
      <DataTemplate><TextBlock /></DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
      <DataTemplate>
        <toolkit:AutoCompleteBox>
          <!-- autocompletebox's item template etc. -->
        </toolkit:AutoCompleteBox>
      </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
  </DataGridTemplateColumn>
  <DataGridTextColumn Header="Text" />
</DataGrid>
È stato utile?

Soluzione

classe estesa Per spostare attenzione alla colonna successiva che ho fatto (scheda funziona bene per me):

public class ExAutoCompleteBox : AutoCompleteBox
{
        public ExAutoCompleteBox()
        {
            PreviewKeyUp += (o, e) =>
            {
                if (e.Key == Key.Enter)
                {
                    ((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            };
        }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top