如何在 System.Windows.Controls.ListView 中设置当前关注的项目?
How can I set the currently focussed item in a System.Windows.Controls.ListView?
我在用户控件中有一个 ListView:
<ListView ...
ItemsSource="{Binding Path=MyItemsSource}"
SelectedItem="{Binding Path=SelectedItem}"
SelectionMode="{Binding Path=SelectionMode}"
>
<ListView.View>
<GridView>
...
</GridView>
</ListView.View>
</ListView>
我在视图模型中有代码以编程方式设置 ListView 的 SelectedItem。这是通过在视图模型中设置 SelectedItem 属性 来实现的。
我发现当我的代码将 SelectedItem 属性 设置为特定列表项时,具有键盘焦点的项目不会随之更改。如果我更改 SelectedItem 属性 然后按向上箭头键,则新选择的项目是之前选择的项目上方的项目(因为该项目仍然具有焦点),而不是上方的项目新选择的项目。
this question 中选择的答案建议使用如下代码:
ListViewItem item = myListView.ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem;
但是,该解决方案不适合我。我收到以下错误:
CS0039: Cannot convert type 'System.Windows.DependencyObject' to 'System.Windows.Forms.ListViewItem' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion.
我已经解决了 this question 中描述的问题,该问题涉及在以编程方式设置所选项目后,当用户按住 Shift 键并单击时,错误的列表项目被用作多选的起点。这可以通过在设置所选项目之前和之后更改 SelectionMode 来解决:
private MyItemType _selectedItem;
public MyItemType SelectedItem
{
get
{
return _selectedItem;
}
set // Use SetSelectedItemInternal() internally!
{
SetProperty(ref _selectedItem, value);
}
}
/// <summary>
/// Use this when programatically setting the SelectedItem. This method incorporates a workaround for a bug (?) in WPF
/// that causes confusing behaviour when shift-selecting items in the list after the SelectedItem is programatically changed.
/// See
/// </summary>
private void SetSelectedItemInternal(MyItemType newSelectedItem, bool scrollToNewItem = true)
{
SelectionMode = SelectionMode.Single;
SelectedItem = newSelectedItem;
SelectionMode = SelectionMode.Extended;
if (scrollToNewItem)
{
ScrollToListItem(MyItemsSource.IndexOf(newSelectedItem));
}
}
CS0039: Cannot convert type 'System.Windows.DependencyObject' to 'System.Windows.Forms.ListViewItem'
您的代码中有错误的 using
语句(引用 windows 表单命名空间)。此外,只需转换为 DependencyObject
,因为这显然是您列出的内容。然后您应该能够集中精力,尽管 UI 如果新选择的项目不在屏幕上,虚拟化会阻止它。
我在用户控件中有一个 ListView:
<ListView ...
ItemsSource="{Binding Path=MyItemsSource}"
SelectedItem="{Binding Path=SelectedItem}"
SelectionMode="{Binding Path=SelectionMode}"
>
<ListView.View>
<GridView>
...
</GridView>
</ListView.View>
</ListView>
我在视图模型中有代码以编程方式设置 ListView 的 SelectedItem。这是通过在视图模型中设置 SelectedItem 属性 来实现的。
我发现当我的代码将 SelectedItem 属性 设置为特定列表项时,具有键盘焦点的项目不会随之更改。如果我更改 SelectedItem 属性 然后按向上箭头键,则新选择的项目是之前选择的项目上方的项目(因为该项目仍然具有焦点),而不是上方的项目新选择的项目。
this question 中选择的答案建议使用如下代码:
ListViewItem item = myListView.ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem;
但是,该解决方案不适合我。我收到以下错误:
CS0039: Cannot convert type 'System.Windows.DependencyObject' to 'System.Windows.Forms.ListViewItem' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion.
我已经解决了 this question 中描述的问题,该问题涉及在以编程方式设置所选项目后,当用户按住 Shift 键并单击时,错误的列表项目被用作多选的起点。这可以通过在设置所选项目之前和之后更改 SelectionMode 来解决:
private MyItemType _selectedItem;
public MyItemType SelectedItem
{
get
{
return _selectedItem;
}
set // Use SetSelectedItemInternal() internally!
{
SetProperty(ref _selectedItem, value);
}
}
/// <summary>
/// Use this when programatically setting the SelectedItem. This method incorporates a workaround for a bug (?) in WPF
/// that causes confusing behaviour when shift-selecting items in the list after the SelectedItem is programatically changed.
/// See
/// </summary>
private void SetSelectedItemInternal(MyItemType newSelectedItem, bool scrollToNewItem = true)
{
SelectionMode = SelectionMode.Single;
SelectedItem = newSelectedItem;
SelectionMode = SelectionMode.Extended;
if (scrollToNewItem)
{
ScrollToListItem(MyItemsSource.IndexOf(newSelectedItem));
}
}
CS0039: Cannot convert type 'System.Windows.DependencyObject' to 'System.Windows.Forms.ListViewItem'
您的代码中有错误的 using
语句(引用 windows 表单命名空间)。此外,只需转换为 DependencyObject
,因为这显然是您列出的内容。然后您应该能够集中精力,尽管 UI 如果新选择的项目不在屏幕上,虚拟化会阻止它。