Вопрос

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

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

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

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

Это было полезно?

Решение

Один из вариантов — установить 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>

Другие советы

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

    private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = !editRights;
    }

Привязаны ли ваши данные 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 (или ListViewItem) с использованием прикрепленных свойств:http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top