2015-03-28 2 views
2

Я хочу научиться программированию WPF. Я хочу знать, связывание пол персонала в ComboBox:WPF ComboboxItem binding

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 < -> строка (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; 
     } 
    } 
} 

Когда я запустить приложение, персонал не равно нулю (все остальное (например, имя, дата рождения ...) связан хорошо, за исключением Пол :(

Edit:

Когда я создал список Genders и привязал его к свойству ComboBox ItemsSource вместо использования тегов, он работал хорошо. Зачем???

+0

Когда я создал список Genders и привязал его к свойству ComboBox ItemsSource вместо тегов , он работал хорошо. Почему ??? – Fanliver

+0

вы можете вставить свой полный код – Rohit

ответ

1

выпадающий использует ComboBoxItem как тип элемента, когда вы явно добавить их как

<ComboBox> 
    <ComboBoxItem Content="..."/> 
    ... 
</ComboBox> 

Это означает, что SelectedItem свойство возвращает ComboBoxItem, который затем передается на ваш конвертер. Однако ваш конвертер не ожидает значений типа ComboBoxItem.

Когда вы добавляете целые числа - как в списке связанных лиц Genders - тип элемента - int, который вы успешно обрабатывали в конвертере. В этом случае класс ComboBox создает и использует ComboBoxItems только внутри страны.

Это общее поведение во всех элементах управления WPF, которые получены от ItemSource. Они используют тип элемента, который предоставляется пользователем.


Это говорит, вы, как правило, используют тип перечисления для Гендерное собственности:

public enum Gender 
{ 
    Male, Female, Other 
} 

public class Staff 
{ 
    public Gender Gender { get; set; } 
} 

Затем нужно добавить Gender значения с ComboBox и связать SelectedItem без преобразователя:

<ComboBox SelectedItem="{Binding Staff.Gender}"> 
    <local:Gender>Male</local:Gender> 
    <local:Gender>Female</local:Gender> 
    <local:Gender>Other</local:Gender> 
</ComboBox> 

где local является объявлением пространства имен XAML пространства имен C#, которое содержит тип Gender.

+0

спасибо за вашу помощь. Основываясь на вашем ответе, я попытаюсь использовать вместо Fanliver

Смежные вопросы