我在wpf中使用mvvm。我正在设置一个表单来更新用户数据。我有一个组合框来选择用户的性别。我在源代码中手动添加了组合框项目。加载数据以形成所有字段时,其他字段正确显示。但是组合框没有显示任何东西。我使用了两个绑定,我从表单中选择的值都在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; }
}
答案 0 :(得分:2)
我怀疑SelectedEmployees.gender不是类型组合框 采用直接在组合框中创建组合框的捷径是一个不好的举动。
当我这样做时:
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>
我在绑定的性别中得到一个字符串而不是一个组合框。 你可能想要更像这样的东西。
答案 1 :(得分:1)
这可能是最好的方法,特别是如果你想学习MVVM:使用针对性别的枚举类型。 &#34; LOL&#34;永远不是一个有效的性别,所以不要让任何人尝试使用它。通过将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>
请参阅Andy的回答,了解另一种通过ItemsSource
使用字符串填充ComboBox的方法。