WPF ListBox可以为"只读"吗?

时间:2020-03-06 15:00:45  来源:igfitidea点击:

我们有一个场景,我们要显示项目列表并指出哪个是"当前"项目(带有小箭头标记或者更改的背景色)。

ItemsControl对我们不利,因为我们需要" SelectedItem"的上下文。但是,我们希望以编程方式移动选择,并且不允许用户更改选择。

有没有一种简单的方法可以使ListBox不交互式?我们可以通过故意吞下鼠标和键盘事件来弄虚作假,但是我是否缺少一些基本属性(例如将" IsEnabled"设置为false而不影响其视觉样式)来满足我们的需求?

还是...还有另一个WPF控件兼具SelectedSelect属性的ItemsControl呢?

解决方案

ItemsControl / ListBox是数据绑定的吗?

我只是在想,我们可以使每个项目的背景画笔都与源数据中的某个属性绑定,或者将该属性传递给转换器。就像是:

<ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Margin="0">
    <ItemsControl.Resources>
      <local:SelectedConverter x:Key="conv"/>
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <local:Control Background="{Binding Path=IsSelected, Converter={StaticResource conv}}"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

一种选择是将ListBoxItem.IsEnabled设置为false:

<ListBox x:Name="_listBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

这样可以确保这些项目是不可选择的,但是它们可能无法呈现喜好。要解决此问题,我们可以使用触发器和/或者模板。例如:

<ListBox x:Name="_listBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>