微软我认为这可能是一个错误。让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);
}
答案 0 :(得分:2)
通常,我存储对所选项目的引用,更新列表,然后重新选择它。如果从列表中插入或删除内容,ListIndex不是维护选择的可靠方法。
if(MyListControl.Items.Contains(PreviouslySelectedItem)) MyListControl.SelectedItem = PreviouslySelectedItem;