ListBox总是自动选择第一个项目

12

ListBox的行为是自动选择第一项,我该如何避免这种情况?

注意:我更喜欢使用纯XAML来解决问题,如果您有任何代码后台的想法,请不要费心。


我认为你的意思是,当你将焦点移动到列表框时,第一项始终被选择(高亮显示...如果按下向下箭头,则第二项获得焦点)? - Madi D.
  1. 对于将我的问题标记为重复的人,你没有理解我的问题,我也是发布了重复问题的人。
  2. @Madi,当列表框被呈现时,它的第一个项目会自动被选中,我想禁用这个功能。
- Shimmy Weitzhandler
嗯..你可以使用FocusManager来聚焦到某个项目/元素...(全部在xaml中)...但是我无法想出如何让它聚焦于空白 :D - Madi D.
这个回答解决了你的问题吗?如何在WPF Listbox中避免默认选择第一项? - StayOnTarget
9个回答

14

Try

IsSynchronizedWithCurrentItem="False"


7

我尝试使用FocusManager.FocusedElement,将初始焦点设置为listbox本身,这样它就有了焦点,但没有元素被选中。如果按下向下箭头或Tab键,listbox的第一个元素将被选中...

<Window
  ...... 
  FocusManager.FocusedElement="{Binding ElementName=listbox2}">
    <ListBox x:Name="listbox2" HorizontalAlignment="Left"
        VerticalAlignment="Bottom" Width="117.333" Height="116" 
        Margin="30.667,0,0,30">
        <ListBoxItem>Jim</ListBoxItem>
        <ListBoxItem>Mark</ListBoxItem>
        <ListBoxItem>Mandy</ListBoxItem>
</ListBox>

5

如果需要的话,在下一个SelectionChanged事件中删除IsSynchronizedWithCurrentItem="True"并添加它。这解决了我的问题。


4
您可以将SelectedIndex设置为-1:
<ListBox ItemsSource="{Binding MyData}" SelectedIndex="-1"/>

注意:我希望使用纯XAML实现,如果你有任何代码后台的想法,请不要费心。不幸的是,你不能在XAML中完成所有事情……通常可以避免使用代码后台,但仍需要编写转换器、标记扩展或附加属性。

1
我也在寻找和你一样的答案,唯一的小问题是它不起作用。 - Shimmy Weitzhandler
问题在于我想避免这种情况,因为选择会触发一系列的执行操作,在SelecttionChanged处理程序中进行处理。 - Shimmy Weitzhandler

4
下面是我经常使用的一种技巧。它基于上面添加“FocusedElement”属性到你的“Window”或“UserControl”的示例。
我的问题是我不想让窗口上的任何控件获得焦点。对我来说,解决方案是创建一个没有用户界面的虚拟控件,并将焦点分配给它。恰好,“Control”完美地满足了这一要求:
<UserControl
    x:Class="MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FocusManager.FocusedElement="{Binding ElementName=focus_thief}"
    mc:Ignorable="d">
    <Grid>
        <!-- no renderable UI -->
        <Control Name="focus_thief"/>
        <!-- wants focus, but won't get it -->
        <ListBox>
            <ListBoxItem>First Item</ListBoxItem>
        </ListBox>
    </Grid>
</UserControl>

1
非常聪明的解决方案。UI有时会做一些希望的事情,但如果选定的项目被重新样式化,当整个控件重新渲染时仍会保留一个令人讨厌的黑框。您的解决方案可以防止这种情况发生,并且存在于应该存在的位置。我选择将我的重命名为“TakeFocusToAvoidUiSelectingANonSelectedItem”。 - N_tro_P

2
<ListBox SelectioMode="Single" SelectedIndex="-1"/>

我不想选择模式为单选。 - Shimmy Weitzhandler

1

这里也遇到同样的问题。有人找到了“干净”的解决方案吗?
问题在于它导致了一堆触发器的执行。

明显的解决方法/修复方法:

  1. 从XAML中删除SelectionChanged事件处理程序
  2. 在构造函数中添加处理程序,此时InitializeComponents已加载了listbox。

相关的问题和评论应该在现有的评论中进行。 - Shimmy Weitzhandler

1

你是在寻找 SelectedIndex 属性吗?或者我没有理解你的意思...


1
你理解我的意思,但是当我将SelectedIndex设置为-1或者选择项设置为x:Null时,第一项仍然被选中。 - Shimmy Weitzhandler

-2

添加一个空白项。


把XAML弄得一团糟的就是那些临时解决方案。 - Scover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接