Может ли WPF ListBox быть «только для чтения»? - PullRequest
14 голосов
/ 02 октября 2008

У нас есть сценарий, в котором мы хотим отобразить список элементов и указать, какой элемент является «текущим» (с небольшим маркером стрелки или измененным цветом фона).

ItemsControl нам не нужен, потому что нам нужен контекст "SelectedItem". Однако мы хотим перемещать выделение программно и не разрешать пользователю изменять его.

Есть ли простой способ сделать ListBox неинтерактивным? Мы можем выдумать это, преднамеренно проглатывая события мыши и клавиатуры, но я упускаю какое-то фундаментальное свойство (например, установка «IsEnabled» в false, не затрагивая его визуальный стиль), которое дает нам то, что мы хотим?

Или ... есть другой элемент управления WPF, который является лучшим из обоих миров - ItemsControl со свойством SelectedItem?

Ответы [ 4 ]

18 голосов
/ 02 октября 2008

Один из вариантов - установить 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>
3 голосов
/ 09 февраля 2011

У меня была такая же проблема. Я решил это, оставив для IsEnabled значение true и обработав событие PreviewMouseDown объекта ListBox. В обработчике установите e.Handled в true, если вы не хотите, чтобы он редактировался.

    private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = !editRights;
    }
1 голос
/ 05 января 2011

Невыбираемый функционал ListBoxItem (или ListViewItem) с использованием прикрепленных свойств: http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

1 голос
/ 02 октября 2008

Связана ли ваша база данных 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>
...