Почему привязка моих радиокнопок к настройкам приложения меняет их поведение при нажатии?

Возможный дубликат:
Использование ApplicationSettings для хранения свойства Checked для WinForms RadioButtons

У меня есть три радиокнопки в групповом ящике. Когда они не привязаны к настройкам приложения, они ведут себя нормально.

После привязки каждого из их проверенных свойств к настройкам приложения происходит следующее: мне нужно дважды щелкнуть непроверенную радиокнопку, чтобы проверить ее. После первого щелчка все три снимаются.

Я также пробовал связать только два из них, но поведение осталось прежним.

Может ли кто-нибудь помочь с этим?

Спасибо.

Я также спросил на MSDN Visual Основной общий форум.


person Geoffrey    schedule 25.06.2010    source источник
comment
Вы путаете радиокнопки и флажки?   -  person leppie    schedule 25.06.2010
comment
@leppie, нет. Это точно радиокнопки, круглые.   -  person Geoffrey    schedule 25.06.2010
comment
Можете ли вы предоставить подробную информацию о привязке? Т.е. соответствующие свойства кнопок rb и то, как это выглядит в app.config   -  person Henk Holterman    schedule 25.06.2010
comment
@Henk, привязано только свойство Checked каждого радиокнопки. К сожалению, проект находится у меня дома на компьютере. Сегодня вечером я отредактирую вопрос с помощью файла app.config. Спасибо.   -  person Geoffrey    schedule 25.06.2010
comment
Упс! Я нашел почти такой же вопрос уже в StackOverflow, и ответ уже был отмечен как правильный. Надеюсь, у меня это сработает, когда я буду тестировать его сегодня вечером. Кто-нибудь с достаточным количеством репутации должен объединить вопросы. stackoverflow .com / questions / 937281 /.   -  person Geoffrey    schedule 25.06.2010
comment
Отмеченный ответ у меня не сработал, но во втором ответе была ссылка на объяснение проблемы. Это известная проблема. Я придумал свой ответ.   -  person Geoffrey    schedule 26.06.2010


Ответы (1)


Вы можете добавить следующий обработчик событий к событию Click каждого из трех RadioButton (из которых свойства Checked привязаны к параметрам приложения) в вашем GroupBox:

Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click
    If sender.Checked = False Then
        sender.Checked = True
    End If
End Sub

Он работает, даже если после щелчка на нем проверяется отключенный RadioButton через полсекунды.

Причина проблемы была объяснена два года назад (в 2008 году) в разделе 5 документа Surviving WinForms Databinding в блоге Turbulent Intelect (спасибо, ohadsc за ссылку) :

Правило 5. Не привязывайтесь к интерактивным переключателям

Я знаю, как было бы здорово, если бы вы могли просто привязать кучу переключателей к свойству enum. Я действительно. Вы думаете, что просто подключите некоторые события Format и Parse, чтобы преобразовать их обратно в перечисление, и все будет хорошо. Было бы чертовски удобно, если бы это действительно работало. Но WinForms для этого не годится. Для трех полных выпусков сейчас (или это 3.5 релизы?) Так и было. Это из-за порядка событий, который MS не может изменить, не заставив тысячи разработчиков по-настоящему разозлиться.

Проблема действительно сводится к тому, что, в отличие от свойств данных других элементов управления, свойство Checked переключателя фактически не изменяется, пока фокус не покинет переключатель. И, как со всеми элементами управления WinForms, фокус фактически не покидает переключатель до тех пор, пока фокус не будет передан другому элементу управления, и фактически только после того, как сработает событие Click вновь сфокусированного элемента управления. Результатом этого, что касается переключателей, является то, что если вы попытаетесь выполнить привязку к ним, связанные свойства в вашем источнике данных фактически отстают от визуального состояния ваших переключателей на один щелчок. Если у вас есть только два переключателя, источник данных будет находиться точно напротив видимого состояния, пока вы не нажмете где-нибудь еще, что не запускает действие, которое ссылается на эти свойства источника данных. Что может сделать эту ошибку действительно раздражающей. Я почти подумал, что у меня галлюцинации.

Теперь, честно говоря, это возможно. Но это самый грязный клудж из всех, что когда-либо собирались. Ладно, может быть, это не так уж и плохо ... но это точно грязный хакер. Для того, чтобы то, что действительно уже должно быть доступно, нужно потрудиться. Насколько я могу судить, единственный способ решить эту проблему, не отказываясь от механизма привязки данных, - это, по сути, создать собственный элемент управления RadioButton с изменением свойств и порядком событий, которые действительно полезны. Вы можете написать один с нуля или создать подкласс RadioButton и переопределить всю логику событий с помощью настраиваемой обработки сообщений.

person Geoffrey    schedule 26.06.2010