Наилучшая практика для отношений родитель / ребенок-viewmodel в MVVM с использованием Onyx? - PullRequest
0 голосов
/ 02 июня 2009

Привет, ребята!

В настоящее время я работаю над небольшим проектом WPF, использующим MVVM через платформу Onyx.

Моя текущая архитектура выглядит так:

<DockPanel>
    <Menu DockPanel.Dock="Top" Background="#cecece">
        <!-- Menu -->
    </Menu>

    <Grid>
        <views:TranslationView x:Name="translationView" />
    </Grid>
</DockPanel>

Вопрос, который у меня сейчас возникает, заключается в том, как реализовать связь между двумя моделями представления. В настоящее время у меня в основном просто есть TranslationView, имеющий собственный ViewModel без ссылки на родительский ViewModel.

Проблема в том, что я хочу иметь возможность открыть какой-либо файл через MainView, а затем проанализировать содержимое и отобразить их в TranslationView. Есть ли рекомендуемый способ сделать это?

Я думал о том, чтобы просто использовать TranslationViewModel как свойство в MainViewModel и затем использовать его как DataContext для TranslationView, но, похоже, он работает с моделью Onyx для определения ViewModel через ссылку на тип (а не объект). *

1 Ответ

0 голосов
/ 15 июня 2010

У Onyx нет «модели для определения ViewModel через ссылку на тип (а не на объект)». Присоединенному свойству ViewModel можно назначить ссылку на объект. Фактически, это свойство является типом Object и использует принуждение для изменения экземпляра Type в экземпляр объекта указанного типа. Это только для удобства. Вы можете просто назначить ссылку на объект, созданную любым удобным для вас способом.

Как и большинство вопросов, существует множество способов решить вашу проблему. Решение, которое вы упомянули, но отклонили, потому что вы думали, что оно идет вразрез с дизайном Onyx, - это то, которое может сработать, но я не решусь его использовать, просто потому, что оно создает более тесную связь. Другое решение состоит в том, чтобы использовать шаблон Event Agregator для связи между представлениями в отсоединенном виде. Или вы можете использовать более сервис-ориентированный подход. Например, я обычно определяю службу IApplication, которая стоит там, где вы обычно получаете доступ к Application.Current в тесно связанной конструкции. Вы можете предоставить свойство в этой службе для хранения содержимого загруженного файла и предоставить INotifyPropertyChanged в службе, чтобы TranslationViewModel мог знать, что свойство было изменено.

...