我有一个ListBox,当它处于焦点时,当我选择了一个项目时,返回一个有效的SelectedIndex。如果我有一个有效的SelectedIndex并且我在同一个论坛上单击一个TextBox,那么SelectedIndex现在变为-1。但是我想让它保持SelectedIndex不变。我该怎么做呢?
答案 0 :(得分:3)
无论焦点如何,ListBox都会保留它的SelectedIndex。
我在一个带有一个ListBox的空白项目上测试了它,一个TextBox和一个用于显示ListBox的SelectedIndex的Label。在ListBox的SelectedIndexChanged和TextBox的TextChanged事件下,我使用ListBox的SelectedIndex更新了Label
必须有其他事情才能使所选索引更改为-1。
答案 1 :(得分:3)
我和原版海报有同样的问题。 我无法完全理解它,但似乎当你将列表框绑定到一个可观察的集合并且集合被更改时所选项目失去了焦点。
我通过将所选索引保存在变量中并在选定索引为-1时重置它(并且恢复它有效)来解决此问题
答案 2 :(得分:3)
这是一个老问题,但是如果其他人遇到同样的问题,请检查ListBoxItem样式,尤其是如果您使用WPF主题中的一种样式。
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,问题应该消失
答案 3 :(得分:2)
处理SelectedIndexChanged事件并保存所选值,以便在控件重新获得焦点时恢复该值。
答案 4 :(得分:1)
我没有在我的应用程序中验证这一点但是如果当LB失去焦点时SelectedIndex属性发生变化,您可能必须通过缓存最后选择的索引并在控件重新获得焦点时重置它来自行处理该情况。您可以在包含表单中执行此操作,也可以在从ListBox派生的类中执行此操作。
一旦看到它变为-1,您甚至可以尝试设置所选索引。不确定会发生什么,但我很想知道......
编辑:刚试过它,就像另一张海报一样,我也无法重现它。你的LB必须略有不同
答案 5 :(得分:1)
这些控件是在不同的对话框中,还是标签容器上的不同选项卡?这是我能想到的唯一一种在改变焦点时会失去SelectedIndex的方法。否则,任何人如何例如单击按钮对项目执行操作?当焦点转到您点击的按钮时,您将失去选择...