[英]how to set combobox default value in wpf using binding in mvvm when manually setting combobox items
我在WPF中使用mvvm。 我正在设置一个表单来更新用户数据。 我有一个组合框可以选择用户性别。 我已经在源代码中手动添加了组合框项目。 加载数据以形成所有字段时,其他字段将正确显示。 但组合框未显示任何内容。 我使用了twoWay绑定,并且我从表单中选择的值都进入了viewModel。我一直在搜索数小时,发现了许多类似的问题,但对我没有任何帮助。 我在下面插入我的代码段。 请给我一个解决方案。
<ComboBox
Grid.Column="2"
SelectedItem="{Binding SelectedEmployees.gender, Mode=TwoWay}"
SelectedValue="{Binding SelectedEmployees.gender, Mode=TwoWay}"
>
<ComboBoxItem Content="Male"/>
<ComboBoxItem Content="Female"/>
</ComboBox>
我的viewModel代码如下
class EmployeesModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private iServiceClient serviceClient = new iServiceClient();
public EmployeesModel()
{
this.RefreshEmployees();
}
private void RefreshEmployees()
{
this.serviceClient.GetAllEmployeesCompleted += (s, e) =>
{
this.employees = e.Result;
};
this.serviceClient.GetAllEmployeesAsync();
}
private IEnumerable<Employee> employees;
public IEnumerable<Employee> Employees
{
get
{
return this.employees;
}
set
{
this.employees = value;
this.OnPropertyChanged("Employees");
}
}
private Employee selectedEmployees;
public Employee SelectedEmployees
{
get
{
return this.selectedEmployees;
}
set
{
this.selectedEmployees = value;
this.OnPropertyChanged("SelectedEmployees");
}
}
public void OnPropertyChanged(string PropertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
}
并且SelectedEmployees类是
public class Employee
{
[Key]
public int id { get; set; }
public DateTime JoiningDate { get; set; }
public string name { get; set; }
public string gender { get; set; }
public string mobile { get; set; }
public string post { get; set; }
public string salaryType { get; set; }
public decimal salary { get; set; }
public string docname { get; set; }
public int validit { get; set; }
}
我怀疑SelectedEmployees.gender不是comboboxitem类型。
直接使用在组合框中创建组合框项目的捷径是一个错误的举动。
当我做:
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.DataContext>
<local:MainWIndowViewModel/>
</Window.DataContext>
<Window.Resources>
<x:Array Type="sys:String" x:Key="Genders">
<sys:String>Male</sys:String>
<sys:String>Female</sys:String>
</x:Array>
</Window.Resources>
<Grid>
<ComboBox
SelectedItem="{Binding gender, Mode=TwoWay}"
ItemsSource="{StaticResource Genders}"
/>
</Grid>
在绑定的性别中,我得到的是字符串而不是comboboxitem。 您可能想要更多类似的东西。
这可能是最好的方法,特别是如果您要学习MVVM:对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
上的任何绑定的默认值。
正如Andy在评论中指出的那样,您的SelectedValue和SelectedItem都将是ComboBoxItem
实例,因为这就是填充ComboBox的方式。 所需的字符串在ComboBoxItems的Content属性中,因此请使用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>
有关通过ItemsSource
用字符串填充ComboBox的另一种方法,请参见Andy的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.