@Jaguar_sea

Использовать ли UserControl в WPF MVVM?

Доброго времени суток! Пытаюсь разобраться с паттерном MVVM. На своем учебном приложении, которое визуализирует некоторые данные из БД и помогает совершать CRUD операции, я пытаюсь разобраться в частности с работой с окнами. Понятно что для совершения CRU операций необходимо показать пользователю модальное окно. Но как проще это сделать? Создавать для каждой таблицы отдельное полноценное окно с текстбоксами и кнопками или все же создать одно окно в котором будут находится только кнопки и в зависимости от редактируемой таблицы подгружаться тот или иной UserControl? К второму подходу, к сожалению ни смог найти примеров. Прошу помочь ссылкой на статью или готовый пример приложения. И если не трудно, расскажите о минусах и плюсах этих двух подходов.
  • Вопрос задан
  • 7201 просмотр
Решения вопроса 1
@Hydro
C#/.NET Developer
У вас в корне неправильный подход.
Давайте по порядку.
Сначала почитайте про DataContext в WPF, потом про сам MVVM (тщательнее, чем до этого).
По структуре данных: одна таблица - это один тип аггрегации, соответственно другая таблица - другой тип аггрегации, поясню напримере:
есть таблица продукты (Id, Код продукта) и есть таблица заказчики (Id, Имя, Код заказанного продукта), для таблицы продукты, необходимо создать класс Product
class Product : INotifyPropertyChanged
{
  public int Id {get;set;}
  public int Code {get;set;}
  // + реализация INPC
}

По INotifyPropertyChanged погуглите что это.
Затем для таблицы заказчики создать класс Consumer
class Consumer
{
  public int Id {get;set;}
  public string Name {get;set;}
  public IEnumerable<Product> Orders {get;set;}
}

Данные выбираются из БД и для каждой таблицы должен создаваться экземпляр соответствующего ей класса.

Теперь по отображению и CRUD:
Создаете класс с контекстом

class MyShopViewModel : INotifyPropertyChanged
{
 // Выбранный элемент, для которого будем отображать модальное окно
  public object SelectedItem {get;set;}
}


Где то в коде, где открывается модальное окно, например в методе ShowObjectEditor делаете:
public void ShowObjectEditor()
{
  // создаем окно с редактором объекта БД
  var objectEditor = new ObjectEditorView();
  // Устанавливаем ему DataContext, Где myShopViewModel - Объект класса MyShopViewModel
  objectEditor.DataContext = myShopViewModel;
  // показываем окно
  objectEditor.Show();
}

В разметке ObjectEditorView
<Window>
  <ContentPresenter Content="{Binding SelectedItem}"/>
</Window>

Но ContentPresenter не знает как его показывать, вот тут и открывается ответ на Ваш вопрос: для каждого типа данных пишете DataTemplate в ресурсах окна, у меня есть два типа - продукты и заказчики, и разметка приобретает вид
<Window>
  <Window.Resources>
    <ResourceDictionary>
     <DataTemplate TargetType={x:Type Product}>
      // вот тут и описываем чекбоксы и прочую хрен.
     </DataTemplate>
     <DataTemplate TargetType={x:Type Consumer}>
      // вот тут и описываем чекбоксы и прочую хрен.
     </DataTemplate>
    <.ResourceDictionary>
  <.Window.Resources>
  <ContentPresenter Content="{Binding SelectedItem}"/>
</Window>

Теперь для каждого типа данных автоматом подтянется своя разметка и располагаться это будет в одном окне.
Что не понятно - спросите в комментариях.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman Куратор тега C#
C# the best
А в чем разница? Или куча отдельных классов для отдельных окон, такое же количество отдельных UserControl + один класс на одно общее модальное окно. Плюс в конструкторе этого окна будут загромождения в виде создания UserControl`ов в зависимости от передаваемых данных или параметров, или куча конструкторов, все просто когда окон штук 5, а когда их 20-30, то потом запутаться будет легко, а отдельные окна, с вменяемыми названиями (например ДействиеИмяСущностиОкно - AddCustomerWindow, EditProductWindow и тд, без перепутываний типа CustomerAddWindow и EditProductWindow), будет в дальнейшем проще сопровождать. При необходимости можно создать класс строитель, с отдельными методами для создания окон, сущностей и необходимых параметров.
Ответ написан
Комментировать
AxisPod
@AxisPod
Ну вообще если хотите усложнить себе жизнь, не используйте UserControl.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы