Привязка к ObservableCollection <T>и использование ValueConverter - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь привязать ObservableCollection<T> к TreeView (или любому другому элементу управления в этом отношении) через ValueConverter.В ValueConverter я использую расширение AsHierarchy ( scip.be ) для преобразования самообращения (у каждого объекта есть поле ParentId) в иерархию.

Как уже упоминалось, яхранить мои (плоский список) сущности внутри ObservableCollection<T>, где обновления списка отражаются в представлении (GUI), когда я не использую ValueConverter.

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

Исходный кодValueConverter:

public class HierarchyValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;
        ObservableCollection<Entity> data = (ObservableCollection<Entity>)value;
        return data.AsHierarchy(p => p.Id, p => p.ParentId);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Источник Items, с которым я связываю конвертер:

ItemsSource="{Binding Data,
                      Source={StaticResource MyDataSource},
                      Converter={StaticResource HierarchyValueConverter}}"

Я надеюсь, что кто-то может дать ответ, так как этот вызывает у меня довольно долгое время.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Привязка иерархии в видимой форме почти наверняка не будет решена одним методом расширения.

Я бы предложил вам реализовать свой собственный класс утилит, что-то вроде CompositeCollection, но, конечно, нацеленное на иерархическуюустановка, перестройка всего дерева, если добавлен один элемент, быстро станет нежизнеспособной в противном случае.Возможно, это не тривиальная задача, но это общее направление, которое я бы рекомендовал.

0 голосов
/ 16 августа 2011

ObservableCollection реализует интерфейс INotifyCollectionChanged, который уведомляет ваш элемент управления о том, что что-то изменилось.AsHierarchy просто возвращает IEnumerable, который не предоставляет уведомления об изменениях, и поэтому вы больше не будете видеть обновления.

Быстрое и грязное исправление состоит в том, чтобы подписаться на событие CollectionChanged ObservableCollection.В обработчике событий принудительно выполните повторное связывание, чтобы метод Convert преобразователя значений снова запустился.

...