Недавно я начал создавать приложение WPF и просто надеюсь, что кто-нибудь подтвердит мне, что я построение моей общей системной архитектуры должным образом, или поправьте меня, если я куда-то еду в неправильном направлении. Тем более, что я пытаюсь сделать MVVM, здесь задействовано много уровней, и я не уверен, что делаю что-то правильно.
Вот упрощенное описание системы:
Данные хранятся в базе данных SQL Server, доступ к которой осуществляется через Linq to SQL. Допустим, база данных содержит две таблицы: USERS
и USER_GROUPS
. Каждая таблица имеет автоматически сгенерированный класс Linq to SQL, DB_USER
и DB_USER_GROUP
.
Теперь в приложении я хочу отобразить ListBox
с каждым ListBoxItem
, содержащим различные элементы пользовательского интерфейса для отображения / изменения информации о пользователях, что выполняется с помощью DataTemplate
.
У меня есть класс модели представления для окна, который использует запрос Linq to SQL (объединяющий две таблицы) для заполнения ObservableCollection
с именем UserList
, который ListBox
в окне привязан как его ItemsSource
. Пользователь
- это класс, реализующий INotifyPropertyChanged
, который обрабатывает все форматирование / получение / настройку данных базы данных в соответствии с требованиями элементов управления WPF. Раздел обработки кода выглядит примерно так:
DBDataContext db = new DBDataContext();
var allUsers = from user in db.USERs
.Where(u => u.ENABLED == true)
from group in db.USER_GROUPs
.Where(g => g.GROUPID == u.GROUPID)
.DefaultIfEmpty()
select new { user, group };
foreach (var user in allUsers)
{
User u = new User(db, user.user, user.group);
UserList.Add(u);
}
Итак, класс User
построен с частными свойствами для DB_USER
, DB_USER_GROUP
и базы данных DataContext класс. Все общедоступные свойства пользователя
в основном обертывают соответствующие столбцы, с их методами get
, возвращающими значения для использования WPF, и set
, изменяющими столбец ( s), а затем вызов SubmitChanges ()
для частного свойства DataContext для обновления базы данных.
Все работает нормально, но кажется немного громоздким, поэтому мне просто интересно, не пропустил ли я что-нибудь, что могло бы сделать его чище. В частности, хранение DataContext внутри каждого элемента UserList
кажется странным, но я не был уверен в лучшем способе обновления базы данных при изменении данных в пользовательском интерфейсе.
Любые отзывы приветствуются, и, пожалуйста, дайте мне знать, если что-то неясно, я не уверен, насколько хорошо я это объяснил.