Я старался изо всех сил стараться оставаться верным разделению, рекомендованному паттерном MVVM.Одна вещь, которую я не могу понять, как правильно делать, связана с инициализацией моих UserControls.
Мой самый последний пример этого связан с библиотекой, которую я написал для общения с некоторыми низкоуровневыми аппаратными средствами.Эта сборка имеет UserControl, который я могу просто вставить в любой графический интерфейс, который использует это оборудование.Все, что необходимо для его работы, - это установить ссылку на объект, который имеет доступ к низкоуровневым методам.
Однако в этом и заключается моя проблема - в настоящее время UserControl добавляется в GUI черезXAML, где я определяю пространство имен, а затем добавляю UserControl в мое окно.Конечно, на данный момент я не контролирую его создание, поэтому вызывается конструктор по умолчанию.Единственный способ установить необходимую ссылку для управления оборудованием - это вызвать метод в UC.ViewModel может вызвать метод в модели, например, GetController()
, а затем вызвать метод в UserControl, чтобы установить ссылку соответственно.GUI может передавать ссылку на UserControl в ViewModel, когда указанный GUI создает ViewModel, но это нарушает MVVM, потому что ViewModel не должен ничего знать об этом элементе управления.
Другой способ, которым я мог бы иметь дело с этим, состоит в том, чтобы не создайте UserControl в XAML, но вместо этого сделайте все это из-за кода.После того, как ViewModel инициализируется и получает инициализированный UserControl (то есть тот, который имеет низкоуровневую ссылку на объект), он может установить Content of Window в UserControl.Однако это также нарушает MVVM - есть ли способ привязать содержимое окна, TabControl или любого другого элемента к UserControl?
Я хотел бы услышать, сталкивался ли кто-нибудь с этимдо того, и если они подошли к нему первым или вторым способом, который я изложил здесь, или если они выбрали совершенно другой подход.Если то, что я спросил здесь, неясно, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы обновить его с помощью дополнительной информации, диаграмм и т. Д.
ОБНОВЛЕНИЕ
Спасибо за ответы, ребята, но я не очень хорошо объяснил проблему.Я уже использую RelayCommands в ViewModel UserControl для обработки всех вызовов аппаратного уровня (Model), когда пользователь щелкает элемент управления в самом UserControl.Моя проблема связана с первоначальной передачей ссылки на UserControl, чтобы он мог общаться с аппаратным уровнем.
Если я создаю UserControl непосредственно в XAML, я не могу передать ему эту ссылку через конструктор, потому что я могу использовать только конструктор по умолчанию.Решение, которое у меня сейчас есть, не выглядит MVVM-совместимым - мне пришлось назвать UserControl в XAML, а затем в коде (т. Е. Для View) я должен вызвать метод, который я добавил вбыть в состоянии установить эту ссылку.Например, у меня есть GUI UserControl, который содержит диагностический UserControl для моего оборудования:
partial class GUI : UserControl
{
private MainViewModel ViewModel { get; set; }
public GUI( Model.MainModel model)
{
InitializeComponent();
ViewModel = new MainViewModel( model, this.Dispatcher);
ViewModel.Initialize();
this.DataContext = ViewModel;
diagnostics_toolbar.SetViewModel( ViewModel);
user_control_in_xaml.SetHardwareConnection( model.Connection);
}
}
, где внешний класс является основным GUI UserControl, а user_control_in_xaml
- это UserControl, который я должен был назвать в GUI.XAML.
Глядя на это снова, я понимаю, что, вероятно, можно использовать подход именования, потому что все это используется в самом представлении.Я не уверен в передаче информации о модели в user_control_in_xaml
, потому что это означает, что дизайнер должен знать, чтобы вызвать этот метод, если он хочет переделать графический интерфейс - я думал, что идея заключалась в том, чтобы скрыть детали модели из видаслой, но я не уверен, как еще это сделать.
Вы также заметите, что основной GUI передается Model в конструкторе, что я считаю, также плохо.Возможно, мне нужно пересмотреть дизайн, чтобы увидеть, возможно ли, чтобы ViewModel создал Модель, что я обычно и делаю, но в этом случае я не могу вспомнить, почему мне пришлось создавать ее вне GUI.