Это, вероятно, лучший подход, особенно если вы хотите изучить MVVM: используйте тип enum для Gender. «LOL» никогда не является действительным полом, поэтому не позволяйте никому пытаться использовать его. Заполните ComboBox, привязав его к статической коллекции. Инициализируйте SelectedEmployees.gender
значением, которое вы хотите использовать по умолчанию, и об остальном позаботится привязка.
<ComboBox
SelectedItem="{Binding SelectedEmployees.gender}"
ItemsSource="{Binding SelectedEmployees.Genders}"
/>
C #
public class SelectedEmployeesViewModel : ViewModelBase
{
/* ...other stuff... */
private Gender _gender = Gender.Male;
public Gender gender
{
get { return _gender; }
set
{
if (value != _gender)
{
_gender = value;
OnPropertyChanged();
}
}
}
}
public enum Gender
{
Male, Female
}
public static class EnumValues
{
public static IEnumerable<Gender> Genders => Enum.GetValues(typeof(Gender)).Cast<Gender>();
}
<Ч />
Есть и другие подходы. Я не советую идти со строкой, но это по крайней мере показательно:
private String _gender = "Male";
public String gender
{
get { return _gender; }
set
{
if (value != _gender)
{
_gender = value;
OnPropertyChanged();
}
}
}
Реализует ли ваш класс SelectedEmployees
INotifyPropertyChanged
и SelectedEmployees.gender
повышает PropertyChanged
при изменении его значения?
Избавиться от Mode=TwoWay
на привязке; вам не нужно делать это явно. Это значение по умолчанию для любой привязки, которую вы надеваете ComboBox.SelectedValue
или ComboBox.SelectedItem
.
Как указал Энди в комментариях, ваши SelectedValue и SelectedItem будут экземплярами ComboBoxItem
, потому что именно так вы заполнили свой ComboBox. Требуемая строка находится в свойстве Content объекта ComboBoxItems, поэтому используйте SelectedValuePath
, чтобы сообщить об этом ComboBox, и привяжите его к свойству SelectedValue
. SelectedItem
будет самой ComboBoxItem
, которая для вас бесполезна.
<ComboBox
SelectedValue="{Binding SelectedEmployees.gender}"
SelectedValuePath="Content"
>
<ComboBoxItem Content="Male" />
<ComboBoxItem Content="Female" />
</ComboBox>
Вот еще один подход: заполнить ComboBox строками.
<ComboBox
SelectedItem="{Binding SelectedEmployees.gender}"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
>
<sys:String>Male</sys:String>
<sys:String>Female</sys:String>
</ComboBox>
См. Ответ Энди о еще одном способе заполнения ComboBox строками через ItemsSource
.