У меня есть борьба с ComboBox в приложении WPF. Это похоже на некоторые другие вопросы, но классическое решение этой проблемы, похоже, не работает.Настройка WPF ComboBox на null после обновления ItemsSource
По сути, это та же проблема, как это:
WPF ComboBox SelectedItem Set to Null on TabControl Switch
Однако моя ItemsSource уже в XAML после SelectedItem, который является тем, что обычно сортирует это.
Что происходит, так это то, что у меня есть представление со списком на нем с уже загруженными данными, после чего запускается событие, которое обновляет данные, подаваемые в ComboBox. ViewModel расходует событие (запущено BackgroundWorker, которое получает данные) и обновляет свой ObservableCollection, который является ItemsSource с новыми данными. Пример:
int id = (int)Invoice.Customer.DatabaseID;
Customers = new ObservableCollection<Customer>(customers);
Invoice.Customer = Customers.FirstOrDefault(x => x.DatabaseID == id);
Как вы можете видеть, он пытается вернуть Заказчика в счет-фактуру обратно к исходному. Однако это происходит, наблюдаемый с точкой прерывания, однако, как только это будет завершено, клиент получает значение null от неизвестного источника (ни один из моих кодов не отображается в стеке вызовов, это все фреймворк).
Часть XAML для ComboBox это:
<ComboBox DisplayMemberPath="AccountCode"
SelectedItem="{Binding Invoice.Customer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ItemsSource="{Binding Customers}"/>
Итак, подведем итог, мой ComboBox SelectedItem получает значение NULL после ItemsSource обновляется и обеспечение ItemsSource после SelectedItem ничего не делает. Я действительно не могу понять, почему он получает значение null, и я не уверен, где искать. Любые указатели или вещи, на которые я могу смотреть, чтобы найти решение этого, будут очень признательны.
EDIT: Хорошо, я играл с ним немного больше, и я подозреваю, что это имеет какое-то отношение к обновлению, исходящему из BackgroundWorker. Я использую Timer и BackgroundWorker в своей службе данных, чтобы периодически обновлять список клиентов из базы данных, чтобы гарантировать, что данные относительно текущие. BackgroundWorker запускает событие, когда оно завершено, чтобы сообщить заинтересованным объектам, что список был обновлен. Это означает, что когда события расходуются, они находятся в другом потоке. Когда он обновляет этот способ, SelectedItem получает значение null после того, как я установил его в правильный элемент и, следовательно, устанавливает Invoice.Customer в null. Я быстро добавил кнопку к моему представлению, чтобы обновлять клиентов, не используя BackgroundWorker, и это, кажется, работает каждый раз. Я хотел бы периодически обновлять данные, но мне нужно понять это, прежде чем я смогу это сделать.
Я обновил свои ItemsSource, и мой SelectedItem остается там, где он должен быть. Не могу воспроизвести вашу проблему. Показать определение свойства Invoice.Customer. – AnjumSKhan