fix: possible edge case (or kind of)

sample calibration view model move brand combobox editing on database changing to uI thread
This commit is contained in:
2026-06-20 11:58:14 +03:00
parent dc8593f840
commit caee9fafd5
@@ -232,50 +232,56 @@ public partial class SampleCalibrationViewModel : ViewModelBase
// Подписываемся на изменения базы данных для отслеживания изменений списка марок
_context.ChangeTracker.StateChanged += (_, ea) =>
{
// Если запись не интересует нас, то ничего не делаем
if (ea.Entry.Entity is not BrandRecord brandRecord)
return;
// Обновляем данные в интерфейсе
// Dispatcher.UIThread.Invoke нужен потому-что этот метод может (и скорее всего будет) вызван в другом потоке,
// а изменения данных в интерфейсе могут быть вызваны только из потока в котором интерфейс был создан
_ = Dispatcher.UIThread.InvokeAsync(() =>
{
// Если запись не интересует нас, то ничего не делаем
if (ea.Entry.Entity is not BrandRecord brandRecord)
return;
// Если запись добавлена
if (ea.NewState is EntityState.Added)
{
// Добавляем запись
BrandComboBoxItems.Add(new BrandComboBoxItemViewModel(brandRecord.Id, brandRecord.BrandName, brandRecord.MixtureName));
}
// Если запись удалена
else if (ea.NewState is EntityState.Deleted)
{
// Ищем удалённую запись в выпадающем списке марок
var deletedComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id);
// Если запись не найдена в выпадающем списке марок, то логгируем как ошибку
if (deletedComboBoxItem is null)
// Если запись добавлена
if (ea.NewState is EntityState.Added)
{
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
return;
// Добавляем запись
BrandComboBoxItems.Add(new BrandComboBoxItemViewModel(brandRecord.Id, brandRecord.BrandName, brandRecord.MixtureName));
}
// Берём индекс удалённого элемента в выпадающем списке марок
var deletedComboBoxIndex = BrandComboBoxItems.IndexOf(deletedComboBoxItem);
// Если текущий индекс равен удаляемому, то устанавливаем, что элемент не выбран
if (BrandComboBoxSelectedIndex == deletedComboBoxIndex)
BrandComboBoxSelectedIndex = -1;
// Удаляем элемент из выпадающего списка марок
BrandComboBoxItems.RemoveAt(deletedComboBoxIndex);
}
// Если запись изменилась
else if (ea.NewState is EntityState.Modified)
{
// Ищем изменённую запись в выпадающем списке марок
var editedComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id);
// Если запись не найдена в выпадающем списке марок, то логгируем как ошибку
if (editedComboBoxItem is null)
// Если запись удалена
else if (ea.NewState is EntityState.Deleted)
{
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
return;
// Ищем удалённую запись в выпадающем списке марок
var deletedComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id);
// Если запись не найдена в выпадающем списке марок, то логгируем как ошибку
if (deletedComboBoxItem is null)
{
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
return;
}
// Берём индекс удалённого элемента в выпадающем списке марок
var deletedComboBoxIndex = BrandComboBoxItems.IndexOf(deletedComboBoxItem);
// Если текущий индекс равен удаляемому, то устанавливаем, что элемент не выбран
if (BrandComboBoxSelectedIndex == deletedComboBoxIndex)
BrandComboBoxSelectedIndex = -1;
// Удаляем элемент из выпадающего списка марок
BrandComboBoxItems.RemoveAt(deletedComboBoxIndex);
}
// Обновляем элемент из выпадающего списка марок
editedComboBoxItem.BrandName = brandRecord.BrandName;
editedComboBoxItem.MixtureName = brandRecord.MixtureName;
}
// Если запись изменилась
else if (ea.NewState is EntityState.Modified)
{
// Ищем изменённую запись в выпадающем списке марок
var editedComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id);
// Если запись не найдена в выпадающем списке марок, то логгируем как ошибку
if (editedComboBoxItem is null)
{
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
return;
}
// Обновляем элемент из выпадающего списка марок
editedComboBoxItem.BrandName = brandRecord.BrandName;
editedComboBoxItem.MixtureName = brandRecord.MixtureName;
}
});
};
// Подписываемся на изменения свойств для обновления CanScroll