Я пытаюсь выразить свойство перечисления в моей модели представления в виде набора переключателей в моем представлении. Все идет нормально; Я могу выразить это с помощью двустороннего MultiBinding
:
(rb1.IsChecked, rb2.IsChecked, rb3.IsChecked) ‹-> vm.Value
Используемая здесь множественная привязка будет иметь мультиконвертер, который преобразует между (bool, bool, bool) <-> MyValue
; очевидно, одно из (трех) допустимых значений типа MyValue
выбирается на основании того, что bool
равно true
, и наоборот.
Однако это уже немного неудобно: я не могу определить эту привязку в своем представлении Xaml, так как множественные привязки должны быть определены со стороны одного значения. Следовательно, я должен определить множественную привязку в программном коде и использовать SetBinding
установите его в свойстве Value
моей модели представления.
Теперь проблема, на которой я застрял, заключается в том, что я не просто привязываю один набор переключателей к этому значению, а два. Следовательно, мои привязки должны были бы выглядеть так:
(rbA1.IsChecked, rbA2.IsChecked, rbA3.IsChecked) ‹-> vm.Value ‹-> (rbB1.IsChecked, rbB2.IsChecked, rbB3.IsChecked)
Проблема в том, что я не могу использовать SetBinding
для одновременного подключения нескольких привязок к vm.Value
.
Решения, которые я пробовал до сих пор:
- Используйте одну большую мультипривязку, привязку ко всем переключателям одновременно. Это будет означать привязку вида
(rbA1.IsChecked, rbA2.IsChecked, rbA3.IsChecked, rbB1.IsChecked, rbB2.IsChecked, rbB3.IsChecked) <-> vm.Value
. Проблема с этим решением заключается в том, что если один из переключателей (скажем,rbB2
) отмечен галочкой, я не могу сказать, имеет лиrbA2
(не отмеченная отметка) илиrbB2
(отмеченная) «новое, правильное» значение. - Сначала абстрагируйте группы переключателей, определив элемент управления radio group, который предоставляет только одно свойство
SelectedIndex
. Затем это свойство можно удобно привязать к моему свойствуvm.Value
из всех экземпляров моего элемента управления radio group. Хотя это возможно, это требует написания нового класса управления, и мне интересно, единственный ли это способ в WPF. - Привяжите один набор переключателей к другому: путем двустороннего связывания
rbB1
сrbA1
,rbB2
сrbA2
и т. д., а также с использованием множественного связывания только между моимvm.Value
и первым набором переключателей, я достиг бы желаемый эффект, но мне не нравится понятие «главная радиогруппа». Это было бы злоупотреблением элементами графического интерфейса для передачи данных. - Делайте все в коде программной части и вручную обновляйте переключатели и значение модели просмотра. Конечно, это жизнеспособное резервное решение, но похоже, что оно должно быть реализовано в Xaml/с привязками.
vm.Value
со всеми шестью переключателями одновременно. Шесть переключателей могут иметь начальное состояние, такое как(1, 0, 0, 1, 0, 0)
. Теперь предположим, что кто-то нажимает 2-й переключатель во 2-м наборе, поэтому мой мультиконвертер вызывается с(1, 0, 0, 0, 1, 0)
. Как я могу определить, правильный ли первый набор или второй набор, т. е. должно ли быть возвращено первое значение перечисления или второе значение перечисления? Насколько я понимаю, это не удобно. - person O. R. Mapper   schedule 22.09.2012IsChecked
изменяется наtrue
. Однако, когда это происходит, свойстваIsChecked
всех других переключателей меняются наfalse
; что должен вернуть их преобразователь? - person O. R. Mapper   schedule 22.09.2012Binding.DoNothing
. Если вы добавите это как ответ, я приму это. - person O. R. Mapper   schedule 22.09.2012