Переплет словаря к ListView TwoWay - возможно? - PullRequest
4 голосов
/ 04 декабря 2009

Я пытаюсь привязать словарь к ListView, чей шаблон элемента состоит из сетки с двумя текстовыми полями. В идеале я хотел бы иметь возможность изменять ключ и значение KeyValuePair, отображаемое в ListView. Это возможно?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2009

То, что вы ищете, является чем-то похожим на ObservableCollection<T>, но для словаря. Немного Googling нашел следующее от Dr. WPF на строительство ObservableDictionary:

Плюсы и минусы

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

Кроме того, словарь предоставляет свои коллекции Values и Keys через отдельные свойства с одинаковыми именами. Эти коллекции имеют типы Dictionary<TKey, TValue>.ValueCollection и Dictionary<TKey, TValue>.KeyCollection соответственно. Эти CLR-определенные коллекции не наблюдаемы. Таким образом, вы не можете напрямую связываться с коллекцией Values ​​или с коллекцией Keys и ожидать получения динамических уведомлений об изменениях в коллекции. Вместо этого вы должны привязаться непосредственно к наблюдаемому словарю.

Теперь у вас может возникнуть проблема с обновлением Ключа, поскольку вам потребуется каким-то образом убедить словарь в Переместить ваш элемент. Я бы предложил взять ObservableDictionary доктора WPF и вместо него использовать KeyedCollection в качестве резервного хранилища. Таким образом, Ключ получается из самого Предмета, а обновления автоматически перемещают объект в ObservableDictionary.

2 голосов
/ 04 декабря 2009

Если вы посмотрите на реализацию KeyValuePair , то это структура с ключом и значением в качестве свойств только для чтения, поэтому я предполагаю, что в этом случае невозможно создать привязку TwoWay.

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

...