Как связать выбор переключателя WPF с Viewmodel с помощью конверсий?

У меня есть приложение WPF-MVVM...

У меня есть 3 элемента управления радиокнопками - с тремя вариантами = > "Индивидуальный", "Группа" и "Оба". Все 3 имеют одинаковое имя группы... это означает, что можно выбрать только один из этих переключателей.

У меня есть три свойства в viewmodel... для каждого из этих трех параметров... и можно проверить, какой из них выбран.

Function()
{
  if (Is_Individual_property)
  {
   // Individual selected
  }

  if (Is_Group_property)
  {
   // group selected
  }
  if (Is_Both_property)
  {
   // Both selected
  }
}

Но я думаю, что это не лучший подход.

Можно ли иметь только одно свойство в viewmodel и связать значения соответственно?

Ответ 1

Как получить одно свойство и управлять несколькими значениями с помощью конвертера. Например:

XAML:

<Grid>
    <Grid.Resources>
        <local:BooleanToStringValueConverter x:Key="BooleanToStringValueConverter" />
    </Grid.Resources>
    <StackPanel>
        <TextBlock Text="{Binding Property1}" />
        <RadioButton Name="RadioButton1"
                     GroupName="Group1"
                     Content="Value1"
                     IsChecked="{Binding Path=Property1, Converter={StaticResource BooleanToStringValueConverter}, ConverterParameter=Value1}" />
        <RadioButton Name="RadioButton2"
                     GroupName="Group1"
                     Content="Value2"
                     IsChecked="{Binding Path=Property1, Converter={StaticResource BooleanToStringValueConverter}, ConverterParameter=Value2}" />
        <RadioButton Name="RadioButton3"
                     GroupName="Group1"
                     Content="Value3"
                     IsChecked="{Binding Path=Property1, Converter={StaticResource BooleanToStringValueConverter}, ConverterParameter=Value3}" />
    </StackPanel>
</Grid>

Преобразователь

public class BooleanToStringValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (System.Convert.ToString(value).Equals(System.Convert.ToString(parameter)))
        {
            return true;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (System.Convert.ToBoolean(value))
        {
            return parameter;
        }
        return null;
    }
}

Класс:

public class MyClass : INotifyPropertyChanged
{
    private String _property1;
    public String Property1
    {
        get { return _property1; }
        set { _property1 = value; RaisePropertyChanged("Property1"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler temp = PropertyChanged;
        if (temp != null)
        {
            temp(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Window:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new MyClass() { Property1 = "Value1" };
    }
}