Я пытаюсь выразить свойство перечисления в моей модели представления как набор переключателей в моем представлении. Все идет нормально; Я могу выразить, что с двухсторонним MultiBinding
:Inverted TwoWay-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
(отмечен) «новое, правильное» значение. - Прежде всего, группа радиокнопка определит группу радиосвязи, которая предоставляет только один объект
SelectedIndex
. Это свойство затем может быть удобно привязано к моему свойствуvm.Value
из всех экземпляров моей группы радиосвязи. Хотя это возможно, для этого требуется написать новый класс управления, и я задаюсь вопросом, является ли это единственным способом в WPF. - Bind один набор радиокнопок к другому: по двухстороннему-связывающему
rbB1
кrbA1
,rbB2
кrbA2
, и так далее, и с использованием мульти-связывание между моимvm.Value
и первым набор только радио-кнопками, I достигнет желаемого эффекта, но мне не нравится понятие наличия «главной радиогруппы». Было бы злоупотреблять элементами GUI для передачи данных. - Выполняйте все действия с кодом и вручную обновляйте переключатели и значение модели представления. Конечно, это жизнеспособное решение для резервного решения, но это чувствует себя, как это должно быть возможно в Xaml/с привязками.
«Использовать один большой многосвязной», я не совсем понял. У вас есть две группы RadioButton. Вы можете выбрать один элемент из группы 1, и вы можете выбрать один элемент из группы 2. Я не понимаю, что «имеет новое правильное значение». –
@ChrisDD: «Большое многосвязывание» свяжет «vm.Value» со всеми шестью переключателями одновременно. Шесть переключателей могут иметь начальное состояние, такое как '(1, 0, 0, 1, 0, 0)'. Предположим, кто-то щелкнул 2-ю радиокнопку во 2-м наборе, поэтому мой мультиконвертер вызывается с помощью '(1, 0, 0, 0, 1, 0)'. Как определить, правильно ли установлен первый набор или второй набор, то есть, нужно ли возвращать первое значение перечисления или второе значение перечисления? Насколько я вижу, это не удобно. –
Почему вы не используете единую привязку для каждого RadioButton? Используйте конвертер и командный параметр. Например: IsChecked = {Binding VMEnum, Converter = {StaticResource toEnum}, ConverterParameter = {YourEnum: FirstButtonChecked}}. Вам необходимо реализовать двухсторонний конвертер. В любом случае IsChecked = VMEnum == (CommandParameter as Enum) [для одного пути] –