36652


ご教授ください。

WPF上のラジオボタンで何が選択されているかViewModel側で受け取りたいです。  
受け取った結果はViewModelのSelectedのプロパティに選択したRadioButtonによって、enum値を与えたいです。  
ViewのRadioButtonにはまだ何もBindingしていません。

よろしくおねがいします。

ソースコードは以下の通りです。  

[code]

    <StackPanel Name="JobSelector">
      <StackPanel.DataContext>
        <vm:JobSelectorViewModel/>
      </StackPanel.DataContext>
      <RadioButton Name="Taks1" Content="Taks1" IsChecked="True"/>
      <RadioButton Name="Taks2" Content="Taks2" IsChecked="False" />
      <RadioButton Name="Task3" Content="Task3" IsChecked="False"/>
    </StackPanel>
[/code]

[code]

    public class JobSelectorViewModel
    {
      public enum TaskType { Task1, Task2, Task3}
      public TaskType Selected { get; set; }
    
      public JobSelectorViewModel()
      {
         //まだ何も実装してない。
      }
    }
[/code]


CC BY-SA 3.0
2017-07-25T05:58:26.280
36650
2017-07-25T08:38:09.813
12388
question
c# wpf
選択されたRadioButtonによって、ViewModelのプロパティ値を変更したい。


列挙型と`bool`の変換を行う`IValueConverter`を実装するのが一般的かと思います。

[code]

    class SomeValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Equals(value, parameter);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(true.Equals(value))
            {
                return parameter;
            }
            return Binding.DoNothing;
        }
    }
    
[/code]

XAMLでは`TaskType`の定義を移動し、`xmlns:vm`と`someValueConverter`をリソースに登録している場合以下のようになります。

## VM

[code]

    // XAMLから参照できるように名前空間の直下に移動する
    public enum TaskType { Task1, Task2, Task3}
    
    public class JobSelectorViewModel
    {  }
    
[/code]

## XAML

[code]

    <!-- TODO: xmlns:vm="..." をルートに定義する -->
    <!-- TODO: someValueConverterをリソースに定義する -->
    
    <RadioButton
        IsChecked="{Binding Selected
                          , Converter={StaticResource someValueConverter}
                          , ConverterParameter={x:Static vm:TaskType.Task1}}"/>
    
[/code]


CC BY-SA 3.0
2017-07-25T06:23:29.220
36652
2017-07-25T08:38:09.813
2017-07-25T08:38:09.813
5750
5750
36650
answer