WPF Binding Converter - PullRequest
       10

WPF Binding Converter

3 голосов
/ 14 апреля 2009

В данный момент я зашел в тупик со следующей ситуацией:

У меня есть коллекция List<Category>, каждая из которых Category содержит свойства Id, Name и List<string[]> с именем Subcategory (где массив содержит Name и Id этой подкатегории - Мне не хотелось создавать другой класс).

У меня есть TreeView с HierarchicalDataTemplate, правильно привязанным к категориям и подкатегориям. У меня также есть флажки рядом с узлом дерева, и я связываю IsChecked с MultiBinding идентификатора подкатегории / категории и общим списком подкатегорий / категорий, которые должны быть отмечены.

<CheckBox.IsChecked>
    <MultiBinding Converter="{StaticResource IsCategoryChecked}">
        <Binding Path="Id"/>
         <Binding Path="myDataSet.Tables[Categories]/cat_subcat"/>
    </MultiBinding>
</CheckBox.IsChecked>

Конвертер, который я использую, просто проверяет, является ли имя подкатегории / категории, которое я предоставляю, частью списка (оба являются значениями, к которым я привязан). Это отлично работает, и в целом я вполне доволен результатом.

Проблема заключается в преобразовании чека / снятия отметки обратно. Когда пользователь изменяет значение IsChecked, я должен либо добавить Id подкатегории / категории в список всех отмеченных категорий, либо удалить этот Id из него. К сожалению, когда я попытался реализовать метод ConvertBack() для IMultiValueConverter, у меня есть доступ только к измененному АКТУАЛЬНОМУ значению (истинное или ложное значение IsChecked) и НЕТ доступа к идентификатору подкатегории / категории, которая ЭТО КОНКРЕТНЫЙ КОНТРОЛЬНЫЙ ЯЩИК связан с

РЕШЕНИЯ, КОТОРЫЕ Я ПРОБОВАЛ, но с треском провалился:

  1. Сохранение имени подкатегории / категории при первоначальном преобразовании не является вариантом, поскольку я использую один и тот же конвертер для ВСЕХ подкатегорий и, следовательно, я сохраню только последнюю подкатегорию / категорию I ' мы пытались конвертировать.

  2. Использование события MouseUp / KeyUp бесполезно, потому что (по какой-либо причине) они не запускаются (ошибка?).

Я обдумываю игнорировать ConvertBack() и использовать вместо этого Checked / Unchecked события, но чувствую, что это довольно "грязное" решение, потому что я мог бы просто проигнорировать привязки! Это единственный путь? У меня закончились варианты, но я все еще надеюсь на «хорошее» решение, если оно есть!

1 Ответ

2 голосов
/ 14 апреля 2009

У вас есть несколько вариантов, и я использовал оба в производстве:

  1. Перегрузка проверена / снята, как вы сказали, что дает вам максимальный контроль над ситуацией
  2. Добавьте свойство IsCategoryChecked в свою строго типизированную таблицу в коде, за которым обрабатываются необходимые изменения за сценой, и вы привязываетесь к свойству IsCategoryChecked, а не используете конвертер

Второй работает довольно хорошо благодаря частичной классификации со строго типизированными наборами данных. Тем не менее, он все еще не является «бесшовным».

...