forked from amkovkov/GranuSightSoftware2
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:
@@ -232,50 +232,56 @@ public partial class SampleCalibrationViewModel : ViewModelBase
|
|||||||
// Подписываемся на изменения базы данных для отслеживания изменений списка марок
|
// Подписываемся на изменения базы данных для отслеживания изменений списка марок
|
||||||
_context.ChangeTracker.StateChanged += (_, ea) =>
|
_context.ChangeTracker.StateChanged += (_, ea) =>
|
||||||
{
|
{
|
||||||
// Если запись не интересует нас, то ничего не делаем
|
// Обновляем данные в интерфейсе
|
||||||
if (ea.Entry.Entity is not BrandRecord brandRecord)
|
// Dispatcher.UIThread.Invoke нужен потому-что этот метод может (и скорее всего будет) вызван в другом потоке,
|
||||||
return;
|
// а изменения данных в интерфейсе могут быть вызваны только из потока в котором интерфейс был создан
|
||||||
|
_ = Dispatcher.UIThread.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
// Если запись не интересует нас, то ничего не делаем
|
||||||
|
if (ea.Entry.Entity is not BrandRecord brandRecord)
|
||||||
|
return;
|
||||||
|
|
||||||
// Если запись добавлена
|
// Если запись добавлена
|
||||||
if (ea.NewState is EntityState.Added)
|
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)
|
|
||||||
{
|
{
|
||||||
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
|
// Добавляем запись
|
||||||
return;
|
BrandComboBoxItems.Add(new BrandComboBoxItemViewModel(brandRecord.Id, brandRecord.BrandName, brandRecord.MixtureName));
|
||||||
}
|
}
|
||||||
// Берём индекс удалённого элемента в выпадающем списке марок
|
// Если запись удалена
|
||||||
var deletedComboBoxIndex = BrandComboBoxItems.IndexOf(deletedComboBoxItem);
|
else if (ea.NewState is EntityState.Deleted)
|
||||||
// Если текущий индекс равен удаляемому, то устанавливаем, что элемент не выбран
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
_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;
|
else if (ea.NewState is EntityState.Modified)
|
||||||
editedComboBoxItem.MixtureName = brandRecord.MixtureName;
|
{
|
||||||
}
|
// Ищем изменённую запись в выпадающем списке марок
|
||||||
|
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
|
// Подписываемся на изменения свойств для обновления CanScroll
|
||||||
|
|||||||
Reference in New Issue
Block a user