WPF ComboboxItem绑定

时间:2015-03-28 03:34:35

标签: c# wpf xaml data-binding combobox

我想学习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而不是使用标签时,它运行良好。为什么???

1 个答案:

答案 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名称空间声明。