我有一个 ListBox,当我处于焦点时,当我选择一个项目时,它会返回一个有效的 SelectedIndex。如果我有一个有效的 SelectedIndex 并且我在同一个论坛上单击一个 TextBox,SelectedIndex 现在变为 -1。但是我希望它保持其 SelectedIndex 不变。我该怎么做呢?
6 回答
无论焦点如何,ListBox 都将保持其 SelectedIndex。
我在一个空白项目上对其进行了测试,其中一个 ListBox、一个 TextBox 和一个 Label 用于显示 ListBox 的 SelectedIndex。在 ListBox 的 SelectedIndexChanged 和 TextBox 的 TextChanged 事件下,我用 ListBox 的 SelectedIndex 更新了标签
一定有其他原因导致 Selected Index 变为 -1。
我和原始海报有同样的问题。我无法完全弄清楚,但似乎当您将列表框绑定到可观察集合并且集合发生更改时,所选项目失去焦点。
我通过将所选索引保存在变量中并在所选索引为 -1 时将其重置(并且恢复它是有效的)来解决这个问题
这是一个老问题,但如果其他人遇到同样的问题,请检查您的 ListBoxItem 样式,特别是如果您使用的是 WPF Themes 中的一种样式。
WPF 主题的问题特别是包含控制模板之外的部分:
<Style d:IsControlPart="True" TargetType="{x:Type ListBoxItem}">
....
<Style.Triggers>
<Trigger Property="Selector.IsSelected" Value="True">
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush po:Freeze="True" Color="{DynamicResource BlackColor}" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="IsSelected" Value="true" />
</Trigger>
</Style.Triggers>
</Style>
删除 Style.Triggers 问题应该会消失
处理SelectedIndexChanged事件并保存选定的值,以便在控件重新获得焦点时恢复它。
我尚未在我的应用程序中验证这一点,但如果当 LB 失去焦点时 SelectedIndex 属性发生变化,您可能必须自己处理这种情况,方法是缓存最后选择的索引并在控件重新获得焦点时重置它。您可以在包含表单中执行此操作,也可以在从 ListBox 派生的类中执行此操作。
您甚至可以在看到所选索引变为 -1 时尝试设置它。不知道会发生什么,但我很想知道......
编辑:刚刚对其进行了测试,就像其他海报一样,我也无法复制它。您的 LB 必须稍有不同
这些控件是在不同的对话框中,还是在选项卡式容器上的不同选项卡中?这是我能想到的唯一方法,当你改变焦点时你会失去你的 SelectedIndex 。否则,任何人将如何例如单击按钮对项目采取行动?当焦点转到您单击的按钮时,您将失去选择...