2008-10-02 11 views
13

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

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

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

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

ответ

17

Один из вариантов, чтобы установить 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> 
+0

Ваш контрольный образец выполняет работу DataTemplate. Все, что вам нужно в дополнение к Setter for IsEnabled, - это <Свойство триггера = «IsEnabled» Значение = «False»><Свойство Setter = «Foreground» Value = «{StaticResource fgbrush}» /> – 2008-10-02 20:05:25

+0

Хорошая точка Joel. Соответственно изменит мой пример. – 2008-10-04 16:11:23

1

Является ли вашей базой данных 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> 
2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^