0

Есть 2 Combobox'а, которые прибиндины к 2 ObservableCollection (UnitList - Combobx1, PosList - Combobox2). Как сделать так, чтобы при выборе значения в Combobox1 обновлялся список в Combobox2?

Например, в Combobox1 содержатся такие значения: Бухгалтерия, Отдел кадров, Учебная часть и т.д.

Если пользователь выбирает Бухгалтерию, то в Combobox2 выводятся значения: Гл бух, Ст бух, Бух, Кассир и т.д.

Если пользователь выбирает Отдел кадров, то в Combobox2 выводится: Нач отд кадров, Архивариус и т.д.

Я сделал биндинг для SelectedItem в Combobox1, чтобы при изменении выбранного элемента обновлялся список в Combobox2, но ничего не обновляется. Программа получает новый список для PosList, но в самом Combobox изменения не происходят. Что сделал не так?

XAML:

<Window x:Class="Prac.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Prac"
        mc:Ignorable="d"
        Title="MainWindow" Height="550" Width="800">
    <Grid>
        <TextBlock Text="{Binding Path=SomeText}"
                   FontSize="20"
                   VerticalAlignment="Top" HorizontalAlignment="Center"
                   />

        <TextBlock Text="Подразделение"
                   FontSize="15"
                   VerticalAlignment="Top" 
                   HorizontalAlignment="Left"
                   Margin="10,10"
                   />
        <ComboBox ItemsSource="{Binding Path=UnitList}"
                  SelectedItem="{Binding Path=SelectedUnit}"
                  Width="150" 
                  FontSize="15"
                  VerticalAlignment="Top" 
                  HorizontalAlignment="Left"
                  Margin="10,30"/>

        <TextBlock Text="Должность"
                   FontSize="15"
                   VerticalAlignment="Top" 
                   HorizontalAlignment="Left"
                   Margin="10,60"
                   />
        <ComboBox ItemsSource="{Binding Path=PosList, Mode=TwoWay}"
                  SelectedItem="{Binding Path=SelectedPos, UpdateSourceTrigger=PropertyChanged}"
                  Width="150"
                  FontSize="15"
                  VerticalAlignment="Top" 
                  HorizontalAlignment="Left"
                  Margin="10,85"/>
        <Button Content="Проверить наличие мест"
                FontSize="15"                
                   VerticalAlignment="Top" 
                   HorizontalAlignment="Left"
                   Margin="10,120"
                Command="{Binding CheckPlace}"
                />

    </Grid>
</Window>

C#:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace Prac
{
    public class MainWindowVM:INotifyPropertyChanged
    {
        public string SomeText { get; set; }

        // Список подразделений
        public ObservableCollection<string> UnitList { get; set; }

        // Список должностей
        public ObservableCollection<string> PosList { get; set; }

        // Выбранная должность
        public string SelectedPos { get; set; }

        // Выбранное подразделение
        private string selectedUnit = "";
        public string SelectedUnit 
        {
            get => selectedUnit;
            set
            {
                selectedUnit = value;

                // Загрузка должностей взависимости от названия подразделения
                PosList = CollegeCommands.GetPositions(selectedUnit);
            }
        }



        public string SecondName { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string Phone { get; set; }
        public string Education { get; set; }


        public MainWindowVM()
        {
            SomeText = "П0ИСК ВАКАНСИЙ ! ! !";

            UnitList = CollegeCommands.GetUnits();
            SelectedUnit = UnitList[2];            

            PosList = CollegeCommands.GetPositions(SelectedUnit);
            SelectedPos = PosList[0];
        }


        private ICommand _checkPlace;


        public ICommand CheckPlace
        {
            get
            {
                return _checkPlace ?? (_checkPlace = new RelayCommand(x => 
                {
                    // проверка доступных мест на выбранныю должность
                }));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }



    }
}

При запуске проекта, в Combobox2 загружается правильный список должностей: введите сюда описание изображения

Но если изменить подразделение, то значение Combobox2 не меняется, хотя при отладке видно, xnj ghbcdfbdfybt PosList = CollegeCommands.GetPositions(selectedUnit) выполняется: введите сюда описание изображения

YAVAY
  • 23

0 Answers0