Конвертеры привязки WPF

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

У меня есть коллекция 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, я должен либо добавить идентификатор подкатегории в список всех отмеченных категорий, либо удалить этот идентификатор из него. К сожалению, когда я попытался реализовать метод ConvertBack() для IMultiValueConverter, у меня есть доступ только к ФАКТИЧЕСКОМУ значению, которое изменилось (истинное или ложное значение IsChecked), и НЕТ доступа к Id подкатегории, которой является ЭТО КОНКРЕТНЫЙ ПРОВЕРКА привязан к.

РЕШЕНИЯ Я ПОПРОБОВАЛ, но безуспешно:

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

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

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


person Alexandra    schedule 13.04.2009    source источник


Ответы (1)


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

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

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

person user7116    schedule 13.04.2009
comment
Ваше второе предложение кажется интересным. Однако у меня есть один вопрос по этому поводу. Мне нужна привязка TwoWay, что означает, что он должен определить, следует ли отмечать отметку на основе связанных данных (сейчас работает хорошо), И он также должен редактировать данные, если пользователь проверяет. Как мне поступить с целью - ›изменение источника? - person Alexandra; 14.04.2009
comment
Я не понимал, что вы просто использовали String для подкатегорий, что вызывает небольшое затруднение там, где вы не можете точно выполнить ConvertBack. По сути, если бы у вас был полностью развернутый класс Category, который мог быть котом или подкаталогом, они знали бы своего родителя и могли бы обрабатывать Target- ›Source. - person user7116; 14.04.2009