Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

WPF - ConvertBack для коллекции

Имеется список всех контрагентов Contractors, имеется список партнеров Partners, второй список есть подмножество первого, оба свойства доступны в VM
Во View есть ItemsControl с CheckBox'ами в котором содержится список контрагентов:
...
мне нужно теперь расставить флажки в чекбоксах для всех контрагентов, которые являются партнерами:

В конвертере реализовал метод Convert
class CheckPartnersConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values[1] is List partners && values[0] is Contractor c) return partners.Contains(c); return false; }
хорошо, это, вроде, работает.
Как теперь реализовать обратное конвертирование и вообще возможно ли его реализовать?
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { var res = new object[] { Binding.DoNothing, Binding.DoNothing }; return res; } }
Если это невозможно, готов отказаться от представления чекбоксами и заменить его, например на ListBox с SelectionMode="Multiple" и партнеров просто выделять, но там тоже проблемы с SelectedItems победить не удается


Ответ

Мне кажется, вы усложняете себе жизнь.
Смотрите, ваша бизнес-логика хочет отобрать из контрагентов партнёров. Это существенный кусок бизнес-логики, а значит, имеет смысл не пожалеть завести для него отдельный VM-класс:
class MaybePartner : NotifyPropertyChangedImpl { public Contractor Contractor { get; }
bool isPartner; public bool IsPartner { get => isPartner; set { if (Set(ref isPartner, value)) { // тут можно включить контрагента в список или исключить его } } }
public MaybePartner(Contractor c, bool isInitiallyPartner) { Contractor = c; isPartner = isInitiallyPartner; } }
Теперь ваша задача тривиальна: вы при входе в эту часть бизнес логики создаёте список MaybePartner'ов, и привязываетесь просто как

Вроде бы всё.

Комментариев нет:

Отправить комментарий