Ho un controllo ListView WPF, ItemsSource è impostato su un ICollectionView creato in questo modo:tasti freccia non funzionano dopo l'impostazione di programmazione ListView.SelectedItem
var collectionView =
System.Windows.Data.CollectionViewSource.GetDefaultView(observableCollection);
this.listView1.ItemsSource = collectionView;
... dove ObservableCollection è un ObservableCollection di un complesso genere. ListView è configurato per visualizzare, per ciascun elemento, una sola proprietà stringa sul tipo complesso.
L'utente può aggiornare ListView, a quel punto la mia logica memorizza la "stringa chiave" per l'elemento attualmente selezionato, ri-popola la ObservableCollection sottostante. L'ordinamento e il filtro precedenti vengono quindi applicati a collectionView. A questo punto mi piacerebbe "selezionare" l'elemento che era stato selezionato prima della richiesta da aggiornare. Gli oggetti in ObservableCollection sono nuove istanze, quindi confronto le rispettive proprietà della stringa e poi ne seleziono una che corrisponde. Come questo:
private void SelectThisItem(string value)
{
foreach (var item in collectionView) // for the ListView in question
{
var thing = item as MyComplexType;
if (thing.StringProperty == value)
{
this.listView1.SelectedItem = thing;
return;
}
}
}
Tutto questo funziona. Se viene selezionato il quarto elemento e l'utente preme F5, l'elenco viene ricostituito e quindi viene selezionato l'elemento con la stessa proprietà di stringa del quarto elemento precedente. A volte questo è il nuovo 4 ° elemento, a volte no, ma fornisce "least astonishment behavior".
Il problema si verifica quando l'utente successivamente utilizza i tasti di direzione per navigare all'interno di ListView. La prima freccia su o giù dopo un aggiornamento fa sì che il primo elemento nella (nuova) listview sia selezionato, indipendentemente da quale elemento sia stato selezionato dalla logica precedente. Eventuali altri tasti freccia funzionano come previsto.
Perché sta succedendo?
Questo chiaramente viola la regola del "meno stupore". Come posso evitarlo?
EDIT
Su ulteriore ricerca, questa sembra la stessa anomalia descritto dalla risposta
WPF ListView arrow navigation and keystroke problem, tranne che fornire maggiori dettagli.
ho avuto simili, requring dispatch.begininvokes che "riorienterà" più tardi. non dimenticare di segnarti come risposta! –
Intendo accettarlo come risposta, ma penso di non poterlo ancora - c'è un timer. – Cheeso
Brutto, e non è nemmeno affidabile. Per un breve momento, il ListBox è focalizzato (puoi vedere il rettangolo di messa a fuoco), prima che l'oggetto sia nuovamente focalizzato. Quando si preme il tasto freccia in quel momento, la selezione è scomparsa. – ygoe