如何在手动设置组合框项目时使用mvvm中的绑定在wpf中设置组合框默认值

时间:2018-04-26 14:26:22

标签: c# wpf mvvm combobox

我在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; }
}

2 个答案:

答案 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.SelectedValueComboBox.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的方法。