如何使用转换器将WPF单选按钮选择绑定到Viewmodel?

10

我有一个WPF-MVVM应用程序...

我有3个单选按钮控件 - 分别是“个人”,“团体”和“两者皆可”的选项。 所有3个按钮都具有相同的组名...这意味着只能选择其中一个单选按钮。

我可以在ViewModel中拥有三个属性...对于这三个选项中的每一个,我都可以检查哪一个被选中了。

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

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

但我认为这不是最佳方法。

我能否只在视图模型中有一个属性,然后相应地绑定值?


1
我个人认为,将您的模型的数据类型更改为枚举类型会更有意义。这对于互斥选择的单选按钮来说更加合适,并且在 WPF 中,您可以呈现枚举的所有选项。 - Jahan Zinedine
1个回答

22
如何使用转换器来管理多个值,同时只需一个属性。例如:
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));
        }
    }
}

窗口:

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

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

2
我正在寻找转换器...但是我有一个问题...在ConverterParameter中,我们可以使用枚举而不是字符串吗? - Relativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接