当我按向上或向下箭头键一次时,为什么列表框从最后一条记录跳到第一条?
以下是如何重现此问题
主窗口
<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 TwoWay
,UpdateSourceTriggerPropertyChange
等,但没有任何效果。
它只会在开始时发生,一旦它跳到顶部然后表现得应该如此,如果我抓住鼠标并点击该项目然后使用键盘它也可以。
答案 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>
我花了一个小时才弄清楚...