2011-06-21 33 views
1

Microsoft我認爲這可能是一個錯誤。讓ListView GridView顯示一條記錄。當ItemsSource刷新時,GridView會丟失SelectedIndex值

自然,向下箭頭鍵瀏覽ListViewItems。這是我期望的行爲。在XAML中,ItemsSource和SelectedIndex被綁定。我想要的行爲是右箭頭鍵和左箭頭鍵導航到下一個和先前的記錄。

我實現這個的方式是處理ListView PreviewKeyDown事件。我遇到的問題是當ItemSource刷新時SelectedIndex重置爲-1,我希望它保留在舊的SelectedIndex上。所以我必須手動重置SelectedIndex,如下所示。

這是我的問題:之後和直接後左箭頭或右箭頭鍵向上和向下鍵不傳遞正確的SelectedIndex值。

例如SelectedIndex = 4,然後向右箭頭,然後向下鍵傳遞給SelectedIndex的值爲0,傳遞的值應該是4. ListView可視化在SelectedIndex 4上,所以它就像它知道SelectedIndex是4但它也不知道。如果我不更改ItemsSource,則向上和向下箭頭鍵可以正常工作。我嘗試了KeyDown和KeyUp事件,但在上述失敗情況下,這些事件根本不會觸發。

WPF 4.0 Visual Studio 2010中

private void lvCurDocFields_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    Debug.WriteLine("lvCurDocFields_PreviewKeyDown " + e.Key.ToString()); 
    e.Handled = false; 
    Int32 lastIndex; 
    switch (e.Key) // e.KeyCode 
    { 
     case Key.Right: 
      lastIndex = lvCurDocFields.SelectedIndex; 
      App.StaticGabeLib.Search.SelectedDocIndex++; 
      if (lvCurDocFields.SelectedIndex != lastIndex) 
      { 
       lvCurDocFields.SelectedIndex = lastIndex; 
      } 
      e.Handled = true; 
      break; 
     case Key.Left: 
      lastIndex = lvCurDocFields.SelectedIndex; 
      App.StaticGabeLib.Search.SelectedDocIndex--; 
      if (lvCurDocFields.SelectedIndex != lastIndex) 
      { 
       lvCurDocFields.SelectedIndex = lastIndex; 
      } 
      e.Handled = true; 
      break; 
    } 
    base.OnPreviewKeyDown(e); 
} 

回答

2

通常情況下,我要保存了所選項目的引用,更新列表,之後再選擇它。如果事情從列表中被插入或刪除,ListIndex不是維持選擇的可靠方法。

if(MyListControl.Items.Contains(PreviouslySelectedItem)) MyListControl.SelectedItem = PreviouslySelectedItem; 
+0

我不認爲這將工作,因爲從技術上說它不是相同的SelectedItem但它是相同的SelectedIndex。新記錄具有相同的條目(ListItems),但列表項的新值 - 我只是移動一個集合。基本上我認爲我正在做你所建議的,但使用SelectedIndex。我錯過了什麼?請注意,當我導航到新記錄時,它會給出正確的答案。在新記錄後直接通過向上或向下箭頭鍵移動到新的ListItem。 – Paparazzi