按箭头按钮时,列表框选择不会在列表中上下移动

时间:2016-01-19 15:58:11

标签: wpf xaml

当我按向上或向下箭头键一次时,为什么列表框从最后一条记录跳到第一条?

以下是如何重现此问题

主窗口

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ListBox x:Name="MyListbox"
         ItemsSource="{Binding Entities}"
         SelectedItem="{Binding SelectedEntity}" />
</Window> 

背后的代码

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
        MyListbox.Focus();
    }
}

视图模型

public class MainWindowViewModel : NotifyPropertyChanged
{
    public MainWindowViewModel()
    {
        Entities = new ObservableCollection<string>()
        {
            "Batman",
            "Superman",
            "Shrek",
            "Jack Frost",
            "Wolverine"
        };
        SelectedEntity = Entities.Last();
    }

    public ObservableCollection<string> Entities { get; set; }

    private string selectedEntity;
    public string SelectedEntity
    {
        get { return selectedEntity; }
        set { OnPropertyChanged(ref selectedEntity, value); }
    }
}

我在一个大型应用程序中发现了这个问题,并且我设法在上面的代码中单独重现它,所以当窗口出现时,Listbox将选择最后一个项目,如果我按向上箭头键它跳转到第一个项目否前一个。 我在这几行XAML上尝试了Mode TwoWayUpdateSourceTriggerPropertyChange等,但没有任何效果。

它只会在开始时发生,一旦它跳到顶部然后表现得应该如此,如果我抓住鼠标并点击该项目然后使用键盘它也可以。

2 个答案:

答案 0 :(得分:2)

这是因为当您将焦点设置为列表框时,它会将焦点设置为所选项目,使用此代码将焦点设置为项目。

<ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FocusManager.FocusedElement"
                                Value="{Binding RelativeSource={RelativeSource Self}}"></Setter>                    </Trigger>  
            </Style.Triggers>
        </Style>
</ListBox.Resources>

答案 1 :(得分:0)

我意识到将IsTabStop =“ False”设置为ListBoxItem会导致与您报告的行为相同。

<ListBox.ItemContainerStyle>
   <Style TargetType="ListBoxItem">
      <Setter Property="IsTabStop" Value="False"/>
   </Style>
</ListBox.ItemContainerStyle>

我花了一个小时才弄清楚...