UWP Настройка RadioButton.IsChecked в codebehind приводит к странному / неожиданному поведению
У меня есть разные ViewModels в моем FlipView.ItemsSource. Это ViewModels, содержащие корневую сетку, которая содержит некоторые панели StackPanels с информацией, а некоторые панели StackPanels содержат радиокнопки.
jfyi:
Мой шаблон проектирования - mvvm, а мой FlipView имеет селектор шаблона (выбирает шаблон в зависимости от типа модели представления, которую он получает в ItemsSource).
поэтому я получаю всю необходимую мне информацию из базы данных, создаю экземпляры всех моих ViewModel, и каждый экземпляр ViewModel будет выполнять следующий код (довольно простая абстракция).
#region Radiobuttons
RadioButton rb1 = new RadioButton() { Content = "yes" };
RadioButton rb2 = new RadioButton() { Content = "no" };
RadioButton rb3 = new RadioButton() { Content = "yes" };
RadioButton rb4 = new RadioButton() { Content = "no" };
RadioButton rb5 = new RadioButton() { Content = "yes" };
RadioButton rb6 = new RadioButton() { Content = "no" };
StackPanel BindableRadioGroup1 = new StackPanel();
BindableRadioGroup1.Children.Add(rb1);
BindableRadioGroup1.Children.Add(rb2);
StackPanel BindableRadioGroup2 = new StackPanel();
BindableRadioGroup2.Children.Add(rb3);
BindableRadioGroup2.Children.Add(rb4);
StackPanel BindableRadioGroup3 = new StackPanel();
BindableRadioGroup3.Children.Add(rb5);
BindableRadioGroup3.Children.Add(rb6);
Grid RootGrid = new Grid();
Grid.SetRow(BindableRadioGroup1, 0);
Grid.SetRow(BindableRadioGroup2, 1);
Grid.SetRow(BindableRadioGroup3, 2);
RootGrid.Children.Add(BindableRadioGroup1);
RootGrid.Children.Add(BindableRadioGroup2);
RootGrid.Children.Add(BindableRadioGroup3);
foreach (StackPanel sp in RootGrid.Children) {
foreach (RadioButton rb in sp.Children) {
if (rb.Content.ToString() == "yes") {
rb.IsChecked = true;
}
}
}
#endregion
#region CheckBoxes
//CheckBox rb1 = new CheckBox() { Content = "yes" };
//CheckBox rb2 = new CheckBox() { Content = "no" };
//CheckBox rb3 = new CheckBox() { Content = "yes" };
//CheckBox rb4 = new CheckBox() { Content = "no" };
//CheckBox rb5 = new CheckBox() { Content = "yes" };
//CheckBox rb6 = new CheckBox() { Content = "no" };
//StackPanel BindableRadioGroup1 = new StackPanel();
//BindableRadioGroup1.Children.Add(rb1);
//BindableRadioGroup1.Children.Add(rb2);
//StackPanel BindableRadioGroup2 = new StackPanel();
//BindableRadioGroup2.Children.Add(rb3);
//BindableRadioGroup2.Children.Add(rb4);
//StackPanel BindableRadioGroup3 = new StackPanel();
//BindableRadioGroup3.Children.Add(rb5);
//BindableRadioGroup3.Children.Add(rb6);
//Grid RootGrid = new Grid();
//Grid.SetRow(BindableRadioGroup1, 0);
//Grid.SetRow(BindableRadioGroup2, 1);
//Grid.SetRow(BindableRadioGroup3, 2);
//RootGrid.Children.Add(BindableRadioGroup1);
//RootGrid.Children.Add(BindableRadioGroup2);
//RootGrid.Children.Add(BindableRadioGroup3);
//foreach (StackPanel sp in RootGrid.Children) {
// foreach (CheckBox rb in sp.Children) {
// if (rb.Content.ToString() == "yes") {
// rb.IsChecked = true;
// }
// }
//}
#endregion
В случае с RadioButtons:
только последний Radiobutton будет держать его значение. каждый Radiobutton.IsChecked
установлен в true
before устанавливается в false, как только для следующего устанавливается значение true. И не важно, сколько страниц добавлено в FlipView. Только последний RadioButton последней Страницы, который был установлен в true, сохраняет его значение...
Я пробовал этот код в совершенно новом WPF-проекте... Работает нормально...
Я попробовал этот код в совершенно новом UWP-проекте... и получил описанное поведение.
Я изменил RadioButtons на CheckBoxes (только в примере кода)... Отлично работает на свежих проектах UWP и WPF.
Я не могу изменить свои RadioButtons на CheckBoxes в моем официальном проекте, потому что мне пришлось изменить почти все, и решение довольно большое и сложное.
Кстати, даже если я перебираю свои RootGrids через циклы for, как это:
// For every Child-Element of RootGrid
for (int z = 0; z < RootGrid.Children.Count; z++) {
// Check, if the child-elements type is "BindableRadioGroup"
if ((TheQuestions[i].Antwort != null) && (RootGrid.Children[z].GetType() == typeof(BindableRadioGroup))) {
// If so, iterate though all Child-Radiobuttons
for (int x = 0; x < (RootGrid.Children[z] as BindableRadioGroup).rads.Count; x++) {
// and set the Event
(RootGrid.Children[z] as BindableRadioGroup).rads[x].Checked += new RoutedEventHandler(Rb_Checked);
// aditionally check if the Radiobuttons value (if the radiobutton says "yes" or "no") equals the questions answer
if ((RootGrid.Children[z] as BindableRadioGroup).rads[x].Content.ToString() == TheQuestions[i].Antwort) {
// and set the Radiobutton as checked
(RootGrid.Children[z] as BindableRadioGroup).rads[x].IsChecked = true;
}
}
}
}
Никаких изменений в поведении для RadioButtons...
У кого-нибудь была идея?
Благодарю вас!
1 ответ
Моя коллега Суджита выяснила, как решить нашу проблему... UWP обрабатывает кнопки RadioButtons иначе, чем стандартные.NET.
Мы должны установить GroupName для них, потому что UWP отдает приоритет GroupName выше, чем имя StackPanel или что-то в этом роде.
Она прислала мне эту ссылку в качестве ссылки:
https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/radio-button
Может быть, это может кому-то помочь.
С уважением