2009-05-25 1 views
0

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

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

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

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

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

+0

Мысль я только подтвердить 2 вопроса я здесь. Где лучше всего программно добавить представление в регион во время выполнения? и Как настроить регион для использования DataTemplates в сочетании с M-V-VM и Prism, чтобы выбрать View для использования на основе ViewModel? – TheDuke

ответ

1

MVVM + Услуги = предельная мощность!

Служба - это просто интерфейс, который хорошо известен и зарегистрирован в вашем контейнере МОК. Когда 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()); 
} 
+0

Его правильное направление, спасибо. – TheDuke

0

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

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

+0

Я не думаю, что это все. Я бы хотел, чтобы действие добавило новый экземпляр View вместе с ViewModel в другой регион в оболочке. Вы не можете использовать Маршрутизированные команды с шаблоном M-V-VM, и поскольку новый вид должен знать, что показывать в новом представлении, я думаю, что это нужно сделать в ViewModel. – TheDuke

+0

«Вы не можете использовать Маршрутизированные команды с шаблоном M-V-VM» Почему бы и нет? –

+2

Исправьте меня, если я ошибаюсь, я только что кое-что прочитал. Маршрутизированные команды создают пузырьки в визуальном дереве. ViewModel в M-V-VM patter не является частью визуального дерева и не должен ничего знать об этом. – TheDuke

Смежные вопросы