WPF列表框:鼠标悬停时选择项目

8
我正在尝试为列表框制作一个样式,当鼠标停留在项目上时,将所选项目设置为该项目。 有什么提示吗?

好问题。如果能够使用模板而不是代码后台实现这种事件重定向,那将是很好的。 - Russell
1个回答

13

你可以通过 ListBox 中的样式来影响所有项目来实现它:

<ListBox.Resources>
    <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" 
                         Value="True">
                <Setter Property="IsSelected" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListBox.Resources>

当IsMouseOver属性为true时,它会将项目的IsSelected属性设置为true。如果您的ListBox不是多选,则它按照您预期的方式工作。


运行良好。奇怪的是,当我将数据绑定到SelectedItem并且它绑定到的项之前具有值时,鼠标悬停不会选择该项(如果您离开并回来)。有什么想法吗? - Chris McGrath
这很奇怪。出于兴趣,尝试在样式中添加一个setter来将IsSelected设置为false(在触发器之外)。 - Matt Hamilton
不行,这并没有解决问题。我可以绕过它(在启动时不选择任何选项),但我希望能够找出原因。 - Chris McGrath
不是很确定,但属性只有在更改时才会导致绑定更新,因此,如果UI以某种方式与IsSelected属性不同步,则在已经为true的情况下将其设置为true不会导致UI更新。当我有多个ListBox具有不同的项并且所有项都绑定到公共选择时,我遇到了这样的问题。如果ListBox包含该项,则设置选择仅会导致SelectedItem更改,这意味着下次单击ListBox中的项时,IsSelected不会更改,因此对Selection的双向绑定不会更新。 - Dan Bryant
3
对我来说,这听起来更像是属性值优先级的问题。例如,本地值(绑定被视为本地值)比样式触发器具有更高的优先级。这篇文章解释了 DP 的值优先级:http://msdn.microsoft.com/en-us/library/ms743230.aspx - Abe Heidebrecht

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