Привязка MVVM IEnumerable<POCO> к объектам BLL MyGeneration (в режиме реального времени)
Я работаю над своим первым проектом WPF с использованием MVVM. Мне успешно удалось абстрагировать мой сервисный уровень, чтобы я мог использовать (например) файлы XML для хранения данных. Используя IEnumerable коллекций моих POCO, любые изменения в таблице в графическом интерфейсе автоматически распространяются в хранилище.
Теперь я пытаюсь перейти на использование базы данных DB2 нашей компании. Мы используем MyGeneration dOOdads для создания DAL и BLL для нашей базы данных DB2. DAL имеет встроенный CRUD и другие служебные методы.
Один из моих коллег сумел успешно привязать MyGeneration BLL DataView к своему приложению WPF (он не использовал MVVM), чтобы он тоже мог вносить изменения в DataView в реальном времени (требуя только вызова метода SaveChanges BLL).
Моя проблема в том, что при переводе между MyGeneration DataView и моей коллекцией POCO мне нужно было бы явно обновить любые изменения на этом уровне.
Я подхожу к этому неправильно? Будет ли что-то вроде AutoMapper ответом на мою проблему, или у меня все еще не будет отображения в реальном времени?
public override IEnumerable<PromotionPlanHeader> ReadAll()
{
foreach (DataRow row in bll_PROMPLANH.DefaultView.Table.Rows)
{
yield return new PromotionPlanHeader
{
PlanNumber = Convert.ToInt32(row["PLANNUMBER"]),
Active = (row["ACTIVE"].ToString() == "1"),
Capturer = row["CAPTURER"].ToString(),
Region = row["REGION"].ToString(),
Cycle = row["CYCLE"].ToString(),
Channel = row["CHANNEL"].ToString(),
StartDate = ConvertDb2Date(row["STARTDATE"].ToString()),
EndDate = ConvertDb2Date(row["ENDDATE"].ToString()),
AdvertStartDate = ConvertDb2Date(row["ADVERTSTARTDATE"].ToString()),
AdvertEndDate = ConvertDb2Date(row["ADVERTENDDATE"].ToString()),
BpcsDealNumber = Convert.ToInt32(row["BPCSDEALNUMBER"]),
Description = row["DESCRIPTION"].ToString(),
DeactivationReason = row["DEACTIVATIONREASON"].ToString(),
LastSavedUsername = row["LASTUSER"].ToString(),
LastSavedDateTime = ConvertDb2DateTime(row["LASTDATE"].ToString(), row["LASTDATE"].ToString().PadLeft(6, '0'))
};
}
}
1 ответ
Пошаговое руководство "Практические примеры WPF DataGrid" действительно прояснило некоторые вещи для меня. В частности, глава " Связывание в многоуровневом приложении", в которой показано, как обрабатывать обновления и вставки с помощью интерфейса IEditableObject.
Хотя это заставляет меня задуматься, не лучше ли BindingList (?)