С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
.NET 4.x

Событие изменения данных itemSource у comboBox

19.03.2015, 06:13. Показов 5414. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется comboBox, к itemsSource биндится коллекция. Вопрос такой: есть ли событие у comboBox'a которое срабатывает при изменении этой коллекции ? SourceUpdate не срабатывает почему-то, или это не оно ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.03.2015, 06:13
Ответы с готовыми решениями:

DataGridTemplateColumn с ComboBox. Как подключить ItemSource к ComboBox из кода
Есть привязка к таблице и простые стобцы отлично выводят данные, даже DataGridComboBoxColumn к непосредственно к которому программно...

Событие изменения источника данных у ComboBox
Имеется comboBox, к itemsSource биндится коллекция. Вопрос такой: есть ли событие у comboBox'a которое срабатывает при изменении этой...

Событие после изменения текста combobox
Есть два combobox.меняю значение в одном.Жму enter - изменяю значение в другом.На основании его надо заполнить список второго комбика.Но...

11
19 / 19 / 9
Регистрация: 31.05.2011
Сообщений: 31
19.03.2015, 12:14
установите NotifyOnSourceUpdated=true у биндинга, ну и коллекция должна быть наблюдаемая. По идее заработает SourceUpdated, но не уверен)
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.03.2015, 20:27  [ТС]
iflight, не помогло( может как-то влиять то что checkBox находится внутри ItemsControl ?
0
19 / 19 / 9
Регистрация: 31.05.2011
Сообщений: 31
19.03.2015, 23:09
Извиняюсь, упустил в вопросе самое главное. SourceUpdated - будет срабатывать когда источник изменяется из контрола, т.е. в данном случае не подходит.
Возможно вам подойдет ивент ObservableCollection.CollectionChanged.
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
20.03.2015, 06:28  [ТС]
iflight, но тогда я не смогу получить доступ к comboBox. В общем такая ситуация: есть itemsControl. В каждом itom'e находится 2 comboBox 'а при изменении выбора 1-го меняется содержимое второго. Нужно что бы при изменении содержимого 2го comboBox'а поумолчанию сразу выбирался 1-ый элемент. Я хотел делать так: отлавливать событие изменения itrmSource и для текущего comboBox'а ставить itemSelected = 0. Как решить такую проблему ?
0
19 / 19 / 9
Регистрация: 31.05.2011
Сообщений: 31
20.03.2015, 09:58
Цитата Сообщение от NEvOl Посмотреть сообщение
при изменении содержимого 2го comboBox'а
Меняется не сама связанная коллекция, а связывается с другой коллекцией? тогда событие TargetUpdated у второго ComboBox
1
 Аватар для Jylik
110 / 51 / 14
Регистрация: 06.03.2012
Сообщений: 858
20.03.2015, 11:30
Перед добавлением элемента в колекцию - обнуляй КомбоБокс (комбоБокс.Итемс.Клеар), затем сного вешай на него коллекцию через foreach....
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
20.03.2015, 17:38  [ТС]
Jylik, вроде так не получится, потому что комбоБосы находятся в itemsControl и не получится обратиться из обработчика первого комбоБокса ко второму комбобоксу. Или эту проблему как-то можно решить ?
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
20.03.2015, 18:47
Цитата Сообщение от NEvOl Посмотреть сообщение
срабатывает при изменении этой коллекции
Коллекция должна быть ObservableCollection<T>
У нее есть событие CollectionChanged, в нем и обрабатывайте.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
20.03.2015, 19:53  [ТС]
kenny69, как тогда в данном случае обратиться к comboBox-у ?
Что бы было понятней в чем проблема вот код.
Есть страница которая потом отображается во врейме:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<Page x:Class="CRM.CustomerOrderPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"
    Title="CustomerOrderPage">
    <Grid Width="auto">
        <ItemsControl x:Name="CustomerOrdersItemsControl" ItemsSource="{Binding OrdersList, NotifyOnTargetUpdated=True}" HorizontalContentAlignment="Stretch">
            <ItemsControl.Template>
                <ControlTemplate>
                    <ScrollViewer x:Name="ScrollViewer" Padding="{TemplateBinding Padding}">
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderThickness="0.5" BorderBrush="LightGray">
                        <Grid HorizontalAlignment="Stretch" >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition />
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <Grid Margin="5, 5, 5, 5" Width="auto"  Grid.Column="0">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Label Grid.Row="0" Grid.Column="0" Content="Артикул:"/>
                                <TextBox Grid.Row="0" Grid.Column="1" Height="auto" Width="auto" Text="{Binding ProductData.Article}"/>
                                <Label Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Content="{Binding ProductData.NameProduct}"/>
                                <Label Grid.Row="2" Grid.Column="0" Content="Количество:"/>
                                    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding OrderData.Count}"/>
                            </Grid>
 
                            <Image MaxWidth="150" MaxHeight="150"  Grid.Column="1" Source="{Binding ProductData.Image}"/>
 
                            <Grid Width="auto" Margin="5, 5, 5, 5" Grid.Column="2">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Label HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Content="Имя повода:"/>
                                <ComboBox 
                                    x:Name = "reasonsComboBox"
                                    Grid.Row="0" 
                                    Grid.Column="1" 
                                    SelectedIndex="0" 
                                    SelectionChanged="Selector_OnSelectionChanged" 
                                    Text="{Binding Name}" 
                                    ItemsSource="{Binding Reasons}"/>
 
                                <Label HorizontalAlignment="Left" Grid.Row="1" Grid.Column="0" Content="Праздник:"/>
                                <ComboBox    
                                     x:Name = "happyDayComboBox"                                 
                                    Grid.Row="1"                                     
                                    IsEditable="True" 
                                    Grid.Column="1" 
                                    SelectedIndex="0"         
                                    ItemsSource="{Binding Path=ReasonHappyDays}" />
                            </Grid>
<!-- некоторый код разметки -->
</Page>
Класс этой страницы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public partial class CustomerOrderPage : Page
    {
        private CustomerOrderPageVM _customerOrderPageVm;
        private long _idCurrentCustomer;
        private Order _currentOrder;
 
        public CustomerOrderPage(long idCustomer, Order currentOrder):
            this(idCustomer)
        {
            _currentOrder = currentOrder;
            this.Loaded += OnLoaded;
        }
 
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            this.Loaded -= OnLoaded;
            OrderNavigateService.NavigateTo(new PaymentOptionsCustomerOrderPage(_currentOrder));
        }
 
        public CustomerOrderPage(long idCustomer):
            this()
        {
            _idCurrentCustomer = idCustomer;
            _customerOrderPageVm = new CustomerOrderPageVM(_idCurrentCustomer);            
            this.DataContext = _customerOrderPageVm;
 
            if (_customerOrderPageVm.OrdersList.Count == 0)
                OrderNavigateService.HideCustomerOrder();               
            else
                OrderNavigateService.ShowCustomerOrder();
        }
 
        public CustomerOrderPage()
        {
            InitializeComponent();
            this.Unloaded += OnUnloaded;
        }
 
        private void OnUnloaded(object sender, RoutedEventArgs routedEventArgs)
        {
            foreach (CustomerOrder Order in _customerOrderPageVm.OrdersList)
                Order.OrderData.Status = "В ожидании";
        }
 
        //при изменении выбора повода, меняем празники
        private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox currentComboBox = sender as ComboBox;
            CustomerOrder currentCustomerOrder = currentComboBox.DataContext as CustomerOrder;
            if (currentCustomerOrder == null)
                return;
            int idOrder = CustomerOrdersItemsControl.Items.IndexOf(currentCustomerOrder);
            int idReason = currentComboBox.SelectedIndex;
            _customerOrderPageVm.ReSelectHappyDaysByReasonsIndex(idOrder, idReason);
        }
 
        //при нажатии на кнопку провести
        private void CalculateOrderButton_OnClick(object sender, RoutedEventArgs e)
        {
            Button currentOrderButton = sender as Button;
            if(currentOrderButton == null)
                return;
            CustomerOrder currentOrder = currentOrderButton.DataContext as CustomerOrder;
 
            OrderNavigateService.NavigateTo(new PaymentOptionsCustomerOrderPage(currentOrder.OrderData));
        }
    }
И ВМки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//контекст данных для страницы
 public class CustomerOrderPageVM
    {
//itemsControl биндится к этой коллекции
        public ObservableCollection<CustomerOrder> OrdersList { get; set; }
 
        public void ReSelectHappyDaysByReasonsIndex(int idOrder, int idReason)
        {
            OrdersList[idOrder].ReSelectHappyDaysByReasonsIndex(idReason);
        }
 
        public CustomerOrderPageVM(long idCustomer)
        {
            List<Order> currentOrders = Orders.OrdersData.Where(item => item.IdCustomer == idCustomer).ToList();
            List<Reason> tempCurrentReasons = Reasons.ReasonsData.Where(item => item.IdCustomer == idCustomer).ToList(); 
            
            OrdersList = new ObservableCollection<CustomerOrder>();
            foreach (Order currentOrder in currentOrders)
            {
                Product currentProducts =
                    Products.ProductsData.Where(item => item.Article == currentOrder.Article).ToList().FirstOrDefault();
                if (currentProducts == null)
                {
                    MessageBox.Show("Товар с артикулом: " + currentOrder.Article + " не найден!");
                    continue;
                }
 
                OrdersList.Add(new CustomerOrder(
                   currentOrder,
                   currentProducts,
                   tempCurrentReasons));
            }
        }
    }
//------------------------------------
public class CustomerOrder
    {
 
        public Order OrderData { get; set; }
 
        public Product ProductData { get; set; }
 
        public List<Reason> Reasons { get; set; }
        public ObservableCollection<HappyDay> ReasonHappyDays { get; set; }
 
        public void ReSelectHappyDaysByReasonsIndex(int idReason)
        {
            List<long> idHappyDays = HappyDays.GetAllIdByIdReason(Reasons[idReason].Id);
            ReasonHappyDays.Clear();
            foreach (long idHappyDay in idHappyDays)
                ReasonHappyDays.Add(HappyDays.HappyDaysData[(int)idHappyDay]);            
        }
 
        public CustomerOrder(Order order, Product product, List<Reason> reasons)
        {
            OrderData = order;
            ProductData = product;
            Reasons = reasons;
 
            ReasonHappyDays = new ObservableCollection<HappyDay>();
            ReSelectHappyDaysByReasonsIndex(0);
        }
    }
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
20.03.2015, 21:29
Лучший ответ Сообщение было отмечено NEvOl как решение

Решение

К combobox вообще по сути не надо обращаться, все делается во ViewModel по правильному.
К Combobox установлен только Binding.
Набросал небольшой пример каскадного выбора:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  public class Category
    {
        public int Id { get; set; }
 
        public string Title { get; set; }
    }
 
 public class Product
    {
        public int Id { get; set; }
 
        public string Title { get; set; }
 
        public int CategoryId { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
   public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            _repo = new ProductRepository();
            Categories = _repo.GetCategories();
            SelectedCategory = Categories.FirstOrDefault();
        }
 
        private readonly ProductRepository _repo;
 
        private List<Category> _categories;
 
        public List<Category> Categories
        {
            get { return _categories; }
            set
            {
                _categories = value;
                RaisePropertyChanged("Categories");
            }
        }
 
        public List<Product> Products
        {
            get { return _products; }
            set
            {
                _products = value;
                RaisePropertyChanged("Products");
            }
        }
 
        public Category SelectedCategory
        {
            get { return _selectedCategory; }
            set
            {
                _selectedCategory = value;
                UpdateProducts(_selectedCategory);
                RaisePropertyChanged("SelectedCategory");
 
            }
        }
 
        void UpdateProducts(Category category)
        {
            if (_selectedCategory != null)
            {
                Products = _repo.GetProductsByCategory(category.Id);
                SelectedProduct = Products.FirstOrDefault();
            }
            else
            {
                Products = null;
            }
        }
 
        public Product SelectedProduct
        {
            get { return _selectedProduct; }
            set
            {
                _selectedProduct = value;
                RaisePropertyChanged("SelectedProduct");
            }
        }
 
 
 
 
 
        private List<Product> _products;
        private Category _selectedCategory;
        private Product _selectedProduct;
    }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
  <StackPanel>
        <ComboBox ItemsSource="{Binding Categories}" 
                  SelectedItem="{Binding SelectedCategory}"
                  DisplayMemberPath="Title"
                  SelectedValuePath="Id"/>
        
        <ComboBox ItemsSource="{Binding Products}"
                  SelectedItem="{Binding SelectedProduct}"
                  DisplayMemberPath="Title"
                  SelectedValuePath="Id"/>
        
        <TextBlock Text="{Binding SelectedProduct.Title}"/>
    </StackPanel>
Вложения
Тип файла: rar WpfCascadeCombobox.rar (1.88 Мб, 28 просмотров)
1
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
20.03.2015, 21:31
Основная суть в том, что делается Binding к SelectedItem,
А во ViewModel при изменении идет загрузка

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public Category SelectedCategory
        {
            get { return _selectedCategory; }
            set
            {
                _selectedCategory = value;
                UpdateProducts(_selectedCategory);
                RaisePropertyChanged("SelectedCategory");
 
            }
        }
 
        void UpdateProducts(Category category)
        {
            if (_selectedCategory != null)
            {
                Products = _repo.GetProductsByCategory(category.Id);
                SelectedProduct = Products.FirstOrDefault();
            }
            else
            {
                Products = null;
            }
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2015, 21:31
Помогаю со студенческими работами здесь

Как отследить событие изменения значения в ComboBox (2-Dropdown List)?
Привет всем Вопрос 1: Облазил все свойства стандартного Combo Box - так и не нашел - есть ли возможность в оном при развертывание по...

Событие изменения данных в вычисляемом поле?
Я, наверное, в очередной раз спрошу какую-то банальность, но вот пока что-то не могу найти события, которое бы &quot;ловило&quot; изменение...

Как отловить событие изменения данных в DataGridView?
доброго времени суток! припустим у меня есть таблица dataGridView, и мне нужно отследить желательно свойством какимто, было ли...

Событие после изменения данных привязанных к DataGridView
С помощью DataGridView я отображаю записи, однако информация о них одновременно частично отображается и в другом месте (которую приходится...

Обновление данных листа после изменения ComboBox
На листе имеются ячейки G1 (фамилия), K1 (имя), I1 (отчество), N1 (фамилия, инициалы). При обновлении любой из ячеек лист автоматически...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru