Связь между ModelView и ModelView - PullRequest
1 голос
/ 14 июля 2011

Пожалуйста, что вы предлагаете, это лучший (с точки зрения качества архитектуры) подход к следующему сценарию:

ModelViewA (родительский) - для отображения данных требуется коллекция из ModelViewB - доступ к коллекции несколько раз, даже если коллекция остается неизменной

ModelViewB (дочерний элемент) - содержит коллекцию элементов. Коллекция концептуально принадлежит ModelViewB и в основном модифицируется в этом (модельном) представлении. Однако ModelViewA также может изменить коллекцию

В настоящее время я использую коллекцию в ModelViewB и дубликат в ModelViewA. Используя шину обмена сообщениями (MMVM Light toolkit), я заставил ModelViews уведомить друг друга об изменении. Тем не менее, это неудобно, так как я храню дубликаты и синхронизирую их. Я бы предпочел иметь его только в одном месте и получить доступ к нему из ModelViewA и B. Я думал, возможно, внедрить один ModelView в другой, но это увеличит связь и, как правило, чувствует себя неправильно для шаблона MVVM. Я также мог бы просто использовать статическую ссылку на оба ModelView, поскольку у меня есть статический локатор (также из набора инструментов MVVM Light), содержащий ссылки. Или, может быть, есть лучшее решение?

Спасибо

O

1 Ответ

0 голосов
/ 14 июля 2011

Я (вроде) делаю это прямо сейчас.

У меня есть ConsoleViewModel, которая записывает и сохраняет события от исполнения для отображения в пользовательском интерфейсе в моем ConsoleView.Естественно, мои ViewModels хотят взаимодействовать с этой консолью, чтобы записывать их события.

Для этого я создал интерфейс, который предоставляет методы, которые мои ViewModels могут использовать для записи своих событий в консоль.

public interface IConsole
{
  void Info(string message);
  void Info(string messageFormat, params object[] args)
  // etc
}

Мой ConsoleViewModel реализует этот интерфейс, а все другие ViewModel предоставляют открытое свойство типа IConsole, которое они используют для записи в консоль.

При этом вы можете использовать множество методов компоновки.ваши ViewModels.Вы можете использовать DI, или простой сервисный локатор, или (как я уже сделал) определить их в ресурсе.

<Application.Resources>
    <ConsoleViewModel x:Key="ConsoleViewModel" />
    <DerpViewModel x:Key="Derp" 
        Console="{StaticResource ConsoleViewModel}" />
    <!--etc-->     
</Application.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...