2016-11-16 4 views
0

Я изучаю различные функции Prism, и теперь я застреваю при открытии нового окна. Мое приложение Shell имеет область Master region и Detail. В главном регионе Shell есть DataGrid с элементами, которые при нажатии отображают его свойства в области Detail. Что мне нужно - это создать новый экземпляр окна с двойным щелчком по элементу в регионе мастера. И каждое новое окно может оставаться активным до тех пор, пока я не закрою его, поэтому я могу открыть и другие окна, щелкнув любой другой элемент в регионе мастера.Prism Mvvm Mef Interactivity Open window new instance

В предвоенном MVVM-Prism раза, я бы, вероятно, сделать что-то вроде:

ICollection<Window> MyWindows = new List<Window>(); 
    var wnd = MyWindows.SingleOrDefault(x => x.Name == id.ToString()); 
    if (wnd == null) 
    { 
     wnd = new MyWindow(this, id); 
     MyWindows.Add(wnd); 
    } 
    wnd.Show(); 

Но это не годно из ViewModel и призмы Шелла ...

Если бы что-то использовать как InteractionRequestTrigger из моей Shell XAML:

<prism:InteractionRequestTrigger SourceObject="{Binding CyberPopUpViewRequest, Mode=OneWay}"> 
    <prism:PopupWindowAction> 
     <prism:PopupWindowAction.WindowContent> 
      <views:CyberPopUpView /> 
     </prism:PopupWindowAction.WindowContent> 
    </prism:PopupWindowAction> 
</prism:InteractionRequestTrigger> 

Но это позволяет мне создать только одно окно.

ответ

3

Но это не является не годно из ViewModel и призмы Шелла ...

Правда, если бы поместить код непосредственно в модели представления. Но это совершенно нормально, если вы поставите (читай: скрыть) его службы (который вводится в зависимости и может быть заменен на макет при тестировании):

internal class WindowManager : IWindowManager 
{ 
    public void CreateWindow(string id) 
    { 
     Window wnd; 
     if (!_myWindows.TryGetValue(id, out wnd)) 
     { 
      wnd = new MyWindow(Application.Current.MainWindow, id); 
      _myWindows[ id ] = wnd; 
     } 
     wnd.Show(); 
    } 

    private Dictionary<string, Window> _myWindows = new Dictionary<string, Window>(); 
} 
+0

Спасибо, будет проверить это, как я не думал создание окна в сервисе. Возможно ли, что я определяю новые области Призма в новом макете в новом окне? – VladacusB

+0

Я никогда не пробовал, но это может сработать, я полагаю. – Haukinger