Ich habe eine Groupbox mit einigen Radiobuttons. Wie erfahre ich, welche welche geprüft wird? Ich verwende WPF und folge 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>
Nun konnte ich herausfinden, wie ich die IsChecked
-Eigenschaft von RadioButton an eine Eigenschaft in ViewModel binden und dann if.else eine Art Logik in meinem ViewModel ausführen könnte, um den ausgewählten Radiobutton herauszufinden.
Aber gibt es einen anderen eleganten Weg?
sie können RadioButton.Command
von Radiobuttons an einen Befehl Ihres ViewModel binden und einen eindeutigen CommandParameter senden, um zu ermitteln, welche Schaltfläche den Befehl im Commandhandler aufgerufen hat.
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>
Überprüfen Sie im Befehls-Handler nach Parametern, um den Radiobutton zu identifizieren.
Vielen Dank
Sie können eine enum
erstellen, die die Werte der RadioButton
-Objekte als Namen enthält (ungefähr), und dann die IsChecked
-Eigenschaft mithilfe einer enum
an eine Eigenschaft des Typs dieser EnumToBoolConverter
binden.
public enum Options
{
All, Current, Range
}
Dann in deinem Ansichtsmodell oder Code dahinter:
private Options options = Options.All; // set your default value here
public Options Options
{
get { return options; }
set { options = value; NotifyPropertyChanged("Options"); }
}
Fügen Sie die Converter
hinzu:
[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;
}
}
Fügen Sie schließlich die Bindungen in der Benutzeroberfläche hinzu, und legen Sie die entsprechende ConverterParameter
fest:
<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}" />
Nun können Sie feststellen, welche Einstellung festgelegt ist, indem Sie die Variable Options
in Ihrem Ansichtsmodell oder den Code dahinter betrachten. Sie können auch die markierte Variable RadioButton
festlegen, indem Sie die Eigenschaft Options
festlegen.
Wenn Sie die Tag-Eigenschaft für Optionsschaltflächen (boolean, integer, strings) verwenden, wie in seiner 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>
Dann können Sie die folgende Funktion verwenden, um den ausgewählten Wert (Schaltfläche) zu erhalten.
int priority = SelectedRadioValue<int>(0, rP0, rP1, rP2, rP3);
woher
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;
}
Es gibt eine andere MVVM-Methode, um dieses Problem mithilfe der IsChecked-Eigenschaft zu lösen
Hier ist die 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>
Ihr Modell wird so ähnlich sein
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 sieht ungefähr so aus (Die Auswahllogik)
RadioButtonQuestion r = new RadioButtonQuestion();
var selectedElement = rbuttonQuestion.answerOptions.FirstOrDefault(c => c.IsChecked);
r.answer = selectedElement.individualRadioButtonText;
Wenn Sie also den Datenkontext der Ansicht auf dieses Ansichtsmodell setzen. Sie müssen in der Lage sein, es zum Laufen zu bringen.
Ich hoffe es hilft.