Привязка ListBox к словарю класса, отображение ключа и выбор объекта класса вместо KeyValuePair в xaml - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть ListBox, к которому я привязываюсь MyDictionary<string, MyClass> в xaml (DataContext правильно установлено):

<ListBox x:Name="MyListBox" 
SelectedIndex="0"
DataContext="{Binding ElementName=thiswindow}"
SelectedItem="{Binding SelectedMyClass}"
ItemsSource="{Binding Path=MyDictionary}"
SelectedValuePath="Value"
SelectionChanged="MyListBox_SelectionChanged"
DisplayMemberPath="Key">

Я ищу:

  1. Показать ключ, уже достигнутый.
  2. Вернуть выбранный элемент типа MyClass.

Поскольку MyDictionary.Value имеет тип MyClass Я сделал SelectedValuePath="Value", но кажется, что возвращенный выбранный объект имеет тип KeyValuePair<string, MyClass> в соответствии с полученной ошибкой:

Cannot convert '[Test, MyClass]' from type 'KeyValuePair`2' to type 'MyClass' for 'en-US' culture with default
 conversions; consider using Converter property of Binding.

Единственное решение, которое я нашел, это использование SelectionChanged события:

private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var tmp = (KeyValuePair<string, MyClass>)MyListBox.SelectedItem;
            SelectedMyClass= MyDictionary[tmp.Key];    
        }

Я уверен, что есть способ добиться этого только в xaml или, по крайней мере, более чистым способом, при этом продолжая использовать класс Dictionary.

Может быть, с помощью дополнительного использования конвертера? чего мне не хватает?

Связанный вопрос: Привязка к свойству класса в словаре в wpf

1 Ответ

1 голос
/ 25 апреля 2020

, поскольку существует SelectedValuePath, связывайте SelectedValue вместо SelectedItem. тогда не нужно обрабатывать событие выделения (удалить метод обработчика SelectionChanged)

<ListBox x:Name="MyListBox" 
    SelectedIndex="0"
    DataContext="{Binding ElementName=thiswindow}"
    SelectedValue="{Binding SelectedMyClass}"
    ItemsSource="{Binding Path=MyDictionary}"
    SelectedValuePath="Value"
    DisplayMemberPath="Key">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...