Определение проверенного Radiobutton из группового поля в WPF после MVVM
У меня есть групповой ящик с некоторыми радиообменами. Как узнать, какой из них проверен? Я использую WPF и следую за MVVM.
<GroupBox Name="grpbx_pagerange" Header="Print Range">
<Grid >
<RadioButton Name="radbtn_all" Content="All Pages" GroupName="radios_page_range" IsChecked="True" />
<RadioButton x:Name="radbtn_curr" Content="Current Page" GroupName="radios_page_range" />
<RadioButton Name="radbtn_pages" Content="Page Range" GroupName="radios_page_range" />
....
</GroupBox>
Теперь одним из способов, которым я мог бы понять, было привязать каждое свойство RadioButton IsChecked
к некоторому свойству в ViewModel, а затем сделать, если... выберите логику в моей модели ViewModel, чтобы определить выбранную радиообъектуру.
Но есть ли другой элегантный способ?
Ответы
Ответ 1
вы можете привязать RadioButton.Command
Radiobuttons к команде вашего ViewModel и отправить уникальный CommandParameter, чтобы определить, какая кнопка вызвала команду в командном манипуляторе.
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>
в обработчике команд проверьте параметр для идентификации радиообмена.
Спасибо
Ответ 2
Вы можете создать enum
, который содержит значения объектов RadioButton
в качестве имен (грубо), а затем привязать свойство IsChecked
к свойству типа этого enum
с помощью EnumToBoolConverter
.
public enum Options
{
All, Current, Range
}
Тогда в вашей модели модели или кода:
private Options options = Options.All; // set your default value here
public Options Options
{
get { return options; }
set { options = value; NotifyPropertyChanged("Options"); }
}
Добавьте Converter
:
[ValueConversion(typeof(Enum), typeof(bool))]
public class EnumToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null) return false;
string enumValue = value.ToString();
string targetValue = parameter.ToString();
bool outputValue = enumValue.Equals(targetValue, StringComparison.InvariantCultureIgnoreCase);
return outputValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null) return null;
bool useValue = (bool)value;
string targetValue = parameter.ToString();
if (useValue) return Enum.Parse(targetType, targetValue);
return null;
}
}
Затем, наконец, добавьте привязки в пользовательском интерфейсе, установив соответствующий ConverterParameter
:
<RadioButton Content="All Pages" IsChecked="{Binding Options, Converter={
StaticResource EnumToBoolConverter}, ConverterParameter=All}" />
<RadioButton Content="Current Page" IsChecked="{Binding Options, Converter={
StaticResource EnumToBoolConverter}, ConverterParameter=Current}" />
<RadioButton Content="Page Range" IsChecked="{Binding Options, Converter={
StaticResource EnumToBoolConverter}, ConverterParameter=Range}" />
Теперь вы можете узнать, какая из них задана, просмотрев переменную Options
в вашей модели или коде зрения. Вы также можете установить отмеченный RadioButton
, установив свойство Options
.
Ответ 3
Существует еще один способ MVVM решить это с помощью IsChecked Property
Здесь XAML
<Page>
<Page.Resources>
<DataTemplate x:Key="ChoiceItemTemplate">
<RadioButton Content="{Binding individualRadioButtonText}"
IsTabStop="True"
GroupName="choice"
IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
</DataTemplate>
</Page.Resources>
<StackPanel>
<TextBlock Text="{Binding ChoiceQuestion}" />
<ItemsControl ItemsSource="{Binding ListOfAnswerOptions}"
ItemTemplate="{StaticResource ChoiceItemTemplate}" />
</StackPanel>
</Page>
Ваша модель будет чем-то вроде этого
public class RadioButtonQuestion
{
public string ChoiceQuestion { get; set; }
public string answer { get; set; }
public List<AnswerOption> ListOfAnswerOptions { get; set; }
}
public class AnswerOption
{
public string individualRadioButtonText { get; set; }
public bool IsChecked { get; set; }
}
ViewModel будет выглядеть примерно так (логика выбора)
RadioButtonQuestion r = new RadioButtonQuestion();
var selectedElement = rbuttonQuestion.answerOptions.FirstOrDefault(c => c.IsChecked);
r.answer = selectedElement.individualRadioButtonText;
Итак, если вы зададите datacontext представления для этой модели viewmodel. Вы должны уметь заставить его работать.
Надеюсь, что это поможет.
Ответ 4
Если вы используете свойство Tag на кнопках опций (логическое, целое число, строки), как в его XAML
<StackPanel Orientation="Horizontal" Margin="10,10, 0, 0">
<RadioButton Name="rP0" Content="Low " Tag="0" />
<RadioButton Name="rP1" Content="Normal" Tag="1" IsChecked="True" />
<RadioButton Name="rP2" Content="Medium" Tag="2" />
<RadioButton Name="rP3" Content="High" Tag="3" />
</StackPanel>
Затем вы можете использовать следующую функцию, чтобы получить выбранное значение (кнопка)
int priority = SelectedRadioValue<int>(0, rP0, rP1, rP2, rP3);
где
public T SelectedRadioValue<T>(T defaultValue, params RadioButton[] buttons)
{
foreach (RadioButton button in buttons)
{
if (button.IsChecked == true)
{
if (button.Tag is string && typeof(T) != typeof(string))
{
string value = (string) button.Tag;
return (T) Convert.ChangeType(value, typeof(T));
}
return (T)button.Tag;
}
}
return defaultValue;
}
Ответ 5
У меня такая же проблема, и я решил удалить из свойства "GroupName" из Radiobutton.
Удалите свойство GroupName из всех переключателей.
и проверьте