как установить значение по умолчанию в выпадающем списке в wpf, используя привязку в mvvm при ручной настройке элементов в выпадающем списке - PullRequest
0 голосов
/ 26 апреля 2018

Я использую mvvm в wpf. Я устанавливаю форму для обновления пользовательских данных. У меня есть поле со списком, чтобы выбрать пол пользователя. Я добавил элементы комбинированного списка вручную в исходном коде. при загрузке данных для формирования всех полей другие поля отображаются корректно. но в выпадающем списке ничего не отображается. Я использовал двухстороннее связывание, и значения, которые я выбираю из формы, попадают в viewModel. Я искал несколько часов и нашел много похожих проблем, но у меня ничего не получалось. Я вставляю свой сегмент кода ниже. Пожалуйста, дайте мне решение.

<ComboBox 
    Grid.Column="2" 
    SelectedItem="{Binding SelectedEmployees.gender, Mode=TwoWay}" 
    SelectedValue="{Binding SelectedEmployees.gender, Mode=TwoWay}"
    >
    <ComboBoxItem Content="Male"/>
    <ComboBoxItem Content="Female"/>
</ComboBox> 

мой код модели представления как ниже

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 голосов
/ 26 апреля 2018

Это, вероятно, лучший подход, особенно если вы хотите изучить 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.

0 голосов
/ 26 апреля 2018

Я подозреваю, что 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 в моем связанном поле. Вы, вероятно, хотите что-то более похожее на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...