WPF Prism V2 с использованием M-V-VM - добавление представления во время выполнения в регион из ViewModel

Надеюсь, это будет довольно просто, я впервые попробовал WPF с Prism V2 с использованием M-V-VM и до сих пор обнаружил, что все довольно ужасно. Моя оболочка довольно проста: элемент управления лентой вверху, DataGrid тикетов службы поддержки слева и TabControl справа.

Когда пользователь открывает выбранный билет из таблицы данных, я хочу, чтобы билет открывался как вкладка в элементе управления вкладками. Я знаю, что для этого мне нужно добавить и затем активировать просмотр в регионе с помощью RegionManager. Но делать это из ViewModel мне кажется неправильным, хотя я мог бы сделать это с помощью DI (DepenecyInjection), он все еще вызывает тревогу в моей голове о предоставлении ViewModel некоторых знаний о View.

Чтобы добавить к этому, разные модули также будут добавлять другие представления (контакт, клиент и т. Д.) В TabControl, я бы хотел использовать DataTemplates, чтобы TabControl отображал представление правильно, может ли кто-нибудь дать мне какие-либо указатели для этого. .

Большое спасибо Бен

Пожалуйста, полные ответы, а не только ссылки. Для этого нужен StackOverflow!


person TheDuke    schedule 25.05.2009    source источник
comment
Подумал, что я просто подтвердю два вопроса, которые у меня здесь. Где лучше всего программно добавить представление в регион во время выполнения? и как я могу настроить регион для использования DataTemplates в сочетании с M-V-VM и Prism, чтобы выбрать вид для использования на основе ViewModel?   -  person TheDuke    schedule 25.05.2009


Ответы (2)


MVVM + Services = Максимальная мощность!

Сервис - это просто хорошо известный интерфейс, зарегистрированный в вашем контейнере IOC. Когда ViewModel нужно сделать что-то вне себя, например, открыть документ с вкладками, она использует службу. Затем услуга реализуется по мере необходимости для конкретной программы.

Например:

public interface IDocumentService
{
    void OpenDocument(IViewModel viewModel);
}

internal class DocumentService:IDocumentService
{
    public void OpenDocument(IViewModel viewModel)
    {
        // Implement code to select the View for the ViewModel,
        // and add it to your TabControl.
    }
}

{
    // Somewhere in your ViewModel...
    // Make sure you can get the IDocumentService
    IDocumentService docService = ioc.Get<IDocumentService>();
    docService.OpenDocument(new TicketViewModel());
}
person Cameron MacFarland    schedule 06.06.2009

Команды - это способ сделать это - вы отправите себе команду под названием «RequestBringTicketIntoView»; он поднимется к окну, где вы его обработаете. Прочтите статью Джоша Смита:

http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/

person Ana Betts    schedule 27.05.2009
comment
Не думаю, что это все. Я бы хотел, чтобы действие добавляло новый экземпляр View вместе с ViewModel в другой регион в оболочке. Вы не можете использовать маршрутизированные команды с шаблоном M-V-VM, и, поскольку новому представлению нужно будет знать, что показывать в новом представлении, я думаю, что это нужно сделать в ViewModel. - person TheDuke; 28.05.2009
comment
Вы не можете использовать маршрутизированные команды с шаблоном M-V-VM. Почему бы и нет? - person Ana Betts; 28.05.2009
comment
Поправьте меня, если я ошибаюсь, я использую только то, что читал недавно. Перенаправленные команды всплывают в визуальном дереве. ViewModel в шаблоне M-V-VM не является частью визуального дерева и не должен ничего о нем знать. - person TheDuke; 29.05.2009
comment
Если вы используете Prism, вы можете привязать атрибут Command в элементе управления кнопки к DelegateCommand, который можно настроить как дополнительное свойство в вашей модели представления. - person Scott Nimrod; 03.08.2014