WPF MVVM управляет обменом информацией

Я изучаю WPF и MVVM и пытаюсь подчеркнуть хороший дизайн. У меня большой опыт работы с WinForms и C#. Это концептуально, поэтому я не думаю, что мне нужно публиковать код.

У меня есть окно xaml, которое управляет «Профилями». В левой половине находится пользовательское древовидное представление Control, привязанное к ViewModel, которое считывает базу данных и создает иерархию профилей. ViewModel для отдельных профилей, среди прочего, содержит идентификатор базы данных. Правая половина — это еще один настраиваемый элемент управления с ListView и собственной ViewModel, который считывает из базы данных информацию об отдельных профилях.

Обе половины прекрасно работают независимо друг от друга, но теперь я хочу связать выбор дерева с представлением списка, чтобы информация в списке отражала выбор дерева. Как лучше всего это сделать?

Представление в виде дерева предоставляет идентификатор профиля, который можно использовать для поиска информации о профиле в представлении списка. Опять же, цель состоит в том, чтобы просто связать эти два вместе. Я чувствую, что у меня есть несколько вариантов:

-Модель представления дерева может вызывать статический метод в модели представления списка, который обновляет профиль.

-Вся страница может содержать модель представления, в которой есть модели представления членов для обоих компонентов.

-Я мог бы каким-то образом «направить» известный выбранный профиль модели просмотра дерева в элемент управления списком в файле xaml.

Все эти варианты кажутся грязными. Опять же, я учусь здесь и хочу подчеркнуть хороший дизайн, поскольку эти маленькие детали диктуют более важные решения позже.

А идеи?

Спасибо!


person bufferz    schedule 17.11.2009    source источник


Ответы (1)


Вы используете Призму? КАЛ WPF? Если это так, вы можете рассмотреть возможность использования составных событий. Это события, которые работают через ViewModels, есть еще CompositeCommands.

Вы можете настроить составное событие так...

public class ProfileSelectedEvent : CompositePresentationEvent<Profile>
{
}

Затем вы можете использовать EventAggregator для подписки и публикации составных событий. Если вы используете Prism/CAL для WPF, у вас будет подключено Unity, поэтому вы можете просто поместить IEventAggregator в конструктор вашей ViewModel.

TreeViewViewModel(IEventAggregator eventAggregator)

Затем вы можете опубликовать и подписаться на событие через EventAggregator...

EventAggregator.GetEvent<ProfileSelectedEvent>().Publish(profile);

Подписка очень похожа... Я уверен, что вы поняли идею!

Надеюсь это поможет,

Энди

person Andy Clarke    schedule 17.11.2009
comment
Я не использую Prism/CAL, вообще-то я впервые об этом слышу. Становится ли его использование общей тенденцией, которую я должен использовать... другими словами, я вступаю в мир боли, пытаясь учиться только с базовой структурой установки WPF и структурами MVVM? - person bufferz; 17.11.2009
comment
Он просто обеспечивает действительно хорошую основу для построения - вот статья MSDN об этом ... msdn.microsoft.com/en-us/magazine/cc785479.aspx Но на самом деле вам нужно скачать это и загрузить приложение StockTrader, созданное Microsoft в качестве примера... microsoft.com/downloads/ покажет вам, как вы можете собрать вещи вместе, и именно так я начал использовать WPD и MVVM. Надеюсь это поможет ... - person Andy Clarke; 17.11.2009
comment
Спасибо, Энди. Мне потребовалось некоторое время, чтобы понять Prism и что это такое. Копнув глубже, я использую EventAggregator и выполняю то, что хочу. Это дает мне общее направление больше, чем просто строка кода. Спасибо за ваш вклад! - person bufferz; 19.11.2009