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无线电按钮将自动取消选中。