WPF + MVVM + RadioButton:处理与单个属性的绑定

从这个以及关于SO的这个 (和其他)问题以及互联网上的许多其他材料,我理解了如何将单选按钮与VM绑定。

但是所有这些都为单选按钮的每个可能值创建了单独的属性。 一个问题( 这个 )类似于我的要求,但接受的答案建议使用ListBox而不是单选按钮。

要表示人员性别(数据类型CHAR,可能值’M’,’F’),需要在VM中创建三个属性,如PersonGender,IsPersonMale,IsPersonFemale。 我想只在一个属性PersonGender上控制它。 我可以这样做吗? 如果有,怎么样?

你需要一个转换器。

//define this in the Window's Resources section or something similiarly situitable    

转换器

 public class GenderConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return ((string)parameter == (string)value); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return (bool)value ? parameter : null; } } 

使用命令(在此处使用DelegateCommands )

VM:

 public enum Genders { Female, Male } public YourVMClass { public Genders SelectedGender {get; set;} private DelegateCommand _cmdSelectGender; public DelegateCommand CmdSelectGender { get { return _cmdSelectGender ?? (_cmdSelectGender = new DelegateCommand(SelectGender)); } } private void SelectGender(Object parameter) { SelectedGender = (Genders)parameter; } } 

XAML:

                  

(没有测试代码,但这是个主意)

您的要求是可能的,但您需要一些额外的努力才能使其发挥作用。 主要原因是RadioButton的属性IsChecked布尔值 ,多个单选按钮是单独的控件,并不像一个单独的控件。 例如ListBox。

为了您的工作需求,您可以使用转换器 。 将两个Radiobuttons的IsChecked绑定到ViewModel中的PersonGender属性,并使用一个通用转换器并为男性单选按钮传递参数’MALE’,为女性单选按钮传递’FEMALE’。

在Converter中检查参数PersonGender是否相同,并为此返回TRUE

IE浏览器。 如果checkbox命令参数是MALE而PersonGender也是MALE,则复选框已启用否则如果checkbox命令参数为FEMALE且PersonGender为MALE,则复选框未启用,因为返回false。

你需要做的是使用IValueConverter ,将Bool转换为Char,反之亦然。 示例True =>’M’; 假=>’F’

在您的视图中有两个单选按钮。 确保将它们设置在相同的组名称中。 然后,您只需要将PersonGender绑定到仅IsMale单选按钮。 因为然后选中了IsFemale单选按钮。 由于相同的组名,IsMale无线电按钮将自动取消选中。