刷新ItemsSource时,GridView会丢失SelectedIndex值

时间:2011-06-21 16:11:52

标签: wpf listview

微软我认为这可能是一个错误。让ListView GridView显示单个记录。

自然地,向下箭头键导航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);
}

1 个答案:

答案 0 :(得分:2)

通常,我存储对所选项目的引用,更新列表,然后重新选择它。如果从列表中插入或删除内容,ListIndex不是维护选择的可靠方法。

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