2016-03-23 1 views
0

У меня есть приложение на основе модулей, где каждый модуль (DLL) содержит один основной UserControl. Модули загружаются только тогда, когда это необходимо, и его UserControls добавляются в MainWindow. В главном окне используется AvalanDock [2.0] для стыковки модулей UserControls. До сих пор я делаю это так:Добавить динамически загруженные UserControls в AvalanDock MVVM способ

public void DockUserControl(UserControl userControl){ 
    var documentPane = dockingManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault(); 
     if (documentPane != null) 
      var layoutDocument = new LayoutDocument { Content = userControl }; 
      documentPane.Children.Add(layoutDocument); 
      documentPane.SelectedContentIndex = documentPane.Children.IndexOf(layoutDocument); 
} 

Эта модель очень ограничивает, например, я хотел бы связать титул layoutDocument к ViewModel в виде UserControl, ручка закрытия события и т.д .. Поэтому Я хотел бы использовать шаблон MVVM. Типичное использование выглядит следующим образом:

<avalonDock:DockingManager x:Name="dockManager" 
          DocumentsSource="{Binding UserControls}"> 
    <avalonDock:DockingManager.LayoutItemTemplateSelector> 
     ... 
    </avalonDock:DockingManager.LayoutItemTemplateSelector> 
    <avalonDock:DockingManager.LayoutItemContainerStyleSelector> 
     ... 
    </avalonDock:DockingManager.LayoutItemContainerStyleSelector> 
... 

Однако, есть много модулей и главное окно должно только знать, что они имеют общий предок. Поэтому я не могу перечислить все UserControls в LayoutItemTemplateSelector. У меня есть список UserControls.

Есть ли у вас какие-либо идеи, как использовать MVVM с динамически загружаемыми UserControls?

ответ

0

В моем случае, у меня есть:

public ObservableCollection<EditorViewModel> Documents { get; } 

В XAML

<avalonDock:DockingManager x:Name="dockingManager" DocumentsSource="{Binding Documents}" .... 

Тогда я говорю, что это вид, что ViewModel

<avalonDock:DockingManager.Resources> 
      <!-- View with its vm --> 
      <DataTemplate DataType="{x:Type editor:EditorViewModel}"> 
       <editor:EditorView /> 
      </DataTemplate> 
</avalonDock:DockingManager.Resources> 

Наконец я поставил привязок за титул и другие свойства:

<avalonDock:DockingManager.LayoutItemContainerStyle> 
      <Style TargetType="{x:Type avalonDock:LayoutItem}"> <!-- these properties are in its own vm (EditorViewModel instance)--> 
       <Setter Property="Title" Value="{Binding Model.Title}" /> 
       <Setter Property="IsSelected" Value="{Binding Model.IsSelected,Mode=TwoWay}" /> 
       <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" /> 
      </Style> 
     </avalonDock:DockingManager.LayoutItemContainerStyle> 

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

Я надеюсь, что это может вам помочь.

+0

Я думаю, что существует следующая проблема: AvalanDock выбирает View на основе ViewModel. Поэтому, если я использую общий ViewModel для всех моих UserControls, тогда AvalanDoock не сможет решить, какой вид он должен выбрать. Более конкретно я вижу проблему в той части, где вы используете . Или, может быть, мне нужен еще один намек. – Dejvovo

+0

Возможно, у вас может быть общий вид, а затем добавить в него свой пользовательский элемент управления, например, iframe или что-то в этом роде. – ganchito55

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

  • Нет связанных вопросов^_^