我想学习WPF编程。 我想知道将工作人员的性别与ComboBox绑定:
class Staff {
public int Gender {get; set;}
}
class ViewModel {
private Staff _staff
public Staff Staff {
get {return _staff;}
set {
_staff = value;
RaisePropertyChangedEvent("Staff");
}
}
}
<ComboBox SelectedItem="{Binding Staff.Gender, Converter={StaticResource GenderConverter}}">
<ComboBoxItem IsSelected="True" Content="{StaticResource strGenderMale}"/>
<ComboBoxItem Content="{StaticResource strGenderFemale}"/>
<ComboBoxItem Content="{StaticResource strGenderOther}"/>
</ComboBox>
GenderConverter是我自定义的转换器转换为int&lt; - &gt;字符串(0:男,1:女,2:其他)
public class IntegerToGenderConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (value is int) {
if ((int)value == MyConstants.GENDER_MALE) { //GENDER_MALE is 1
return MyConstants.GENDER_MALE_STR; //GENDER_MALE_STR is the string: "Male"
}
if ((int)value == MyConstants.GENDER_FEMALE) {
return MyConstants.GENDER_FEMALE_STR;
}
}
return MyConstants.GENDER_OTHER_STR;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
switch (value.ToString()) {
case MyConstants.GENDER_MALE_STR:
return MyConstants.GENDER_MALE;
case MyConstants.GENDER_FEMALE_STR:
return MyConstants.GENDER_FEMALE;
default:
return MyConstants.GENDER_OTHER;
}
}
}
当我运行应用程序时,工作人员不为空(除了性别之外的所有其他内容(例如姓名,出生日期......)都很好:(
修改
当我创建List Genders并将其绑定到ComboBox的属性ItemsSource而不是使用标签时,它运行良好。为什么???
答案 0 :(得分:1)
当您明确添加
时,ComboBox会将ComboBoxItem
用作项目类型
<ComboBox>
<ComboBoxItem Content="..."/>
...
</ComboBox>
这意味着SelectedItem
属性返回一个ComboBoxItem,然后传递给您的转换器。但是,您的转换器不期望ComboBoxItem类型的值。
当您添加整数时 - 如在绑定的“性别”列表中一样 - 项目类型为int
,您已在转换器中成功处理。在这种情况下,ComboBox类仅在内部创建和使用ComboBoxItems。
这是从ItemSource
派生的所有WPF控件中的常见行为。它们使用用户提供的项目类型。
也就是说,您通常会为您的Gender属性使用枚举类型:
public enum Gender
{
Male, Female, Other
}
public class Staff
{
public Gender Gender { get; set; }
}
然后你会在你的ComboBox中添加Gender
值并在没有转换器的情况下绑定SelectedItem:
<ComboBox SelectedItem="{Binding Staff.Gender}">
<local:Gender>Male</local:Gender>
<local:Gender>Female</local:Gender>
<local:Gender>Other</local:Gender>
</ComboBox>
其中local
是包含Gender
类型的C#名称空间的XAML名称空间声明。