【问题标题】:GridView loses SelectedIndex value when ItemsSource is refreshed刷新 ItemsSource 时,GridView 丢失 SelectedIndex 值
【发布时间】:2011-06-22 02:03:02
【问题描述】:

Microsoft 我认为这可能是一个错误。有一个 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);
}

【问题讨论】:

    标签: wpf listview


    【解决方案1】:

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

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

    【讨论】:

    • 我认为这行不通,因为从技术上讲,它不是同一个 SelectedItem,而是同一个 SelectedIndex。新记录具有相同的条目 (ListItems),但列表项的新值 - 我只是在移动一个集合。基本上我认为我正在按照您的建议做,但使用 SelectedIndex。我错过了什么?请注意,当我导航到新记录时,它确实给出了正确的答案。它打破的地方是在新记录之后直接通过向上或向下箭头键移动到新的 ListItem。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2011-02-01
    相关资源
    最近更新 更多