Ключи словаря .NET в качестве источника данных ListBox - PullRequest
1 голос
/ 27 апреля 2011

У меня есть ListBox в моем приложении winforms.Я хочу, чтобы он имел в качестве источника данных ключи словаря, поэтому я делаю это следующим образом:

IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>();
myListBox.DataSource = myEntities.Keys;

Итак, я получаю во второй строке следующую ошибку:

Сложныйпривязка данных принимает в качестве источника данных либо в Ilist, либо в IListSource

  • Я пробовал две вещи, которые не будут делать:

    myListBox.DataSource = (IList) myEntities.Keys;

создает исключение InvalidCastException:

Невозможно преобразовать объект типа 'KeyCollection [Entity1, Entity2]' в тип 'System.Collections.Generic.IList`1 [Entity1] '.

  • И я также попробовал:

    myListBox.DataSource = myEntities.Keys.К списку();

, но при этом я теряю привязку, когда я изменяю myEntities, myListBox.DataSource не изменяется.

Примечание: Сообщения об исключениях переведены мной, поэтому они могут быть не совсем такими, как я написал.

Есть ли способ сделать это?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 27 апреля 2011
  myListBox.DataSource = (from keys in myEntities.Keys
                         select keys)
                         .ToList();

В третий раз очарование ...

Хорошо,

Полагаю, вам придется унаследовать словарь и переопределить метод .Add, чтобы вызвать событие. На мероприятии вам нужно будет повторно запросить словарь ключей. Согласно ресурсам, которые я нашел (включая: Как связать ... ), словарь не генерирует события при изменении содержимого.

1 голос
/ 28 апреля 2011

Основная проблема заключается в том, что в конечном итоге вы можете использовать словарные ключи в качестве источника данных, но у вас нет способа уведомить источник данных о том, что вы добавили или удалили элементы из словаря.

Это потому, что в словаре нет для этого события уведомления, поэтому источник данных не знает, как и когда изменился ваш словарь.Элементы, которые уже присутствуют в вашем списке, отражают свои изменения просто потому, что DataSource содержит ссылку на них, и поэтому, когда они изменяются, изменения видны везде, где есть ссылка.

Для запуска изменения вВаш словарь, насколько я знаю, у вас не так много вариантов:

  • Написать код для повторного присоединения списка к вашему источнику данных каждый раз, когда вы добавляете или удаляете что-то из словаря (со всеми проблемами сохранения выбранных элементов и т.1016 *

оба они не являются легкими решениями, поэтому, если ваши сущности относительно простые, вы можете рассмотреть некоторые альтернативы, такие как DataTables , которые могут содержать сложный ключ и другие структурированные данные.

0 голосов
/ 27 апреля 2011

Попробуйте использовать

myListBox.DataSource = myEntities
...