15

いくつかのラジオボタンを備えたグループボックスがあります。どちらがチェックされているかを知るにはどうすればよいですか? 私は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>

さて、私が理解できる 1 つの方法は、各 RadioButton のIsCheckedプロパティを ViewModel のプロパティにバインドし、ViewModel で if..else のようなロジックを実行して、選択されたラジオボタンを把握することでした。

しかし、他のエレガントな方法はありますか?

4

5 に答える 5

35

Radiobuttons を ViewModel のコマンドにバインドRadioButton.Commandし、一意の CommandParameter を送信して、どのボタンが commandhandler でコマンドを呼び出したかを識別できます。

<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>

コマンド ハンドラで、ラジオボタンを識別するためのパラメータをチェックします。

ありがとう

于 2013-09-04T14:53:52.877 に答える
20

オブジェクトenumの値を名前として (大まかに) 含むを作成し、を使用してプロパティを this のタイプのプロパティにバインドできます。RadioButtonIsCheckedenumEnumToBoolConverter

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

最後に、適切な を設定して、UI にバインディングを追加します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ます。

于 2013-09-04T15:10:05.187 に答える
1

彼の XAML のように、オプション ボタン (ブール値、整数、文字列) で Tag プロパティを使用する場合

<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;
}
于 2016-01-29T13:43:10.617 に答える
1

IsChecked プロパティを使用してこれを解決する別の MVVM 方法があります。

ここに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;

したがって、ビューのデータコンテキストをこのビューモデルに設定すると. あなたはそれを機能させることができなければなりません。

それが役に立てば幸い。

于 2014-07-10T19:13:20.930 に答える
-4

同じ問題が発生し、ラジオボタンから「GroupName」プロパティを削除して解決しました。

すべてのラジオ ボタンから「GroupName」プロパティを削除してください。そしてチェック

于 2013-11-18T12:57:15.020 に答える