[英]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.