Я превратил горизонтальный элемент ItemsControl в список, чтобы иметь возможность выбирать отдельные элементы, но обнаружил, что выбор был нарушен. Потребовалось время, чтобы отобрать проблемный бит.
Books = new[] { new Book{Id=1, Name="Book1"},
new Book{Id=2, Name="Book2"},
new Book{Id=3, Name="Book3"},
new Book{Id=4, Name="Book4"},
new Book{Id=3, Name="Book3"},
};
<DataTemplate DataType="{x:Type WPF_Sandbox:Book}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
<ListBox ItemsSource="{Binding Books}"/>
Если Book является структурой, выбор списка (режим по умолчанию: одиночный) будет неправильным, если вы выберете элемент, имеющий эквивалентную структуру в списке. например, Book3
Если Book превращается в класс (с семантикой не значащего типа), выбор фиксируется.
Выбор (пока что ни один из них не нравится):
- Я выбрал структуры, потому что их небольшая структура данных и семантика типа значений полезны при сравнении двух экземпляров на равенство. Изменение его на класс приводит к тому, что я теряю семантику типа-значения. Я больше не могу использовать значение Equals по умолчанию или переопределить его для сравнения по элементам.
- Добавьте отличительный атрибут Book исключительно для работы с выбранным списком (например, индекс).
- Устранить дубликаты .. Не возможно.
WPF listbox: проблема с выбором : указывает, что Listbox настраивает SelectedItem, и при обновлении интерфейса для этого он просто подсвечивает все элементы в списке, которые Equal(SelectedItem)
. Не уверен, почему .. выделение SelectedIndex устранит эту проблему; может быть, я что-то упустил.
ListBox выбирает много элементов, даже в SelectionMode = "Single" : показывает ту же проблему, когда элементы списка являются строками (семантика типа значения)