Может ли ListBox WPF быть "только для чтения"?
У нас есть сценарий, в котором мы хотим отобразить список элементов и указать, который является "текущим" элементом (с небольшим маркером стрелки или измененным цветом фона).
ItemsControl не годится для нас, потому что нам нужен контекст "SelectedItem". Тем не менее, мы хотим переместить программу выбора и не разрешить пользователю ее изменять.
Есть ли простой способ сделать ListBox не интерактивным? Мы можем выманить его за счет преднамеренного проглатывания событий мыши и клавиатуры, но не хватает ли какого-либо фундаментального свойства (например, установки "IsEnabled" на false, не затрагивая его визуальный стиль), который дает нам то, что мы хотим?
Или... есть ли другой элемент управления WPF, который лучше всего подходит для обоих миров - элемент ItemsControl с свойством SelectedItem?
Ответы
Ответ 1
Один из вариантов - установить 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>
Ответ 2
У меня была такая же проблема. Я решил это, оставив набор IsEnabled равным true и обработчик события PreviewMouseDown в ListBox. В наборе обработчиков e.Handled to true в случае, если вы не хотите, чтобы его редактировали.
private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = !editRights;
}
Ответ 3
Является ли вашей базой данных ItemsControl/ListBox?
Я просто думаю, что вы можете сделать Background Brush каждого элемента привязанным к свойству из исходных данных или передать свойство через конвертер. Что-то вроде:
<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>
Ответ 4
Неизбираемая функция ListBoxItem (или ListViewItem) с использованием подключенных свойств:
http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/