web-dev-qa-db-ger.com

Bestimmtes geprüftes Radiobutton aus der Gruppenbox in WPF nach MVVM

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?

13
Bhramar

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

29
Nitin

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.

18
Sheridan

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;
}
1
victor

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.

1
HelpMatters