2016-03-23 67 views
0

モジュール(.dll)には1つのメインUserControlが含まれているモジュールベースのアプリケーションがあります。モジュールは、必要なときにロードされ、UserControlsがMainWindowに追加されます。 メインウィンドウはAvalanDock [2.0]を使用してモジュールのUserControlをドッキングしています。これまでのところ、私はそれをこのようにやっている:動的にロードされたUserControlを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のタイトルをバインドクロージングイベントなどを処理したいと思いますMVVMパターンを使用したいと思います。次のように一般的な使用方法が見えます:

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

しかし、多くのモジュールとメインウィンドウが、彼らはいくつかの共通の祖先を持っていることだけ知っている必要がありますがあります。したがって、私はすべてのUserControlをLayoutItemTemplateSelectorにリストすることはできません。私が持っているのは、UserControlsのリストです。

動的にロードされたUserControlでMVVMを使用する方法はありますか?私の場合は

答えて

0

、私が持っている:XAML

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

public ObservableCollection<EditorViewModel> Documents { get; } 

をその後、私はそれの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がViewModelに基づいてViewを選択するという問題があると思います。だから私がすべての私のUserControlsのために一般的なViewModelを使用する場合、AvalanDoockはどのViewを選択すべきかを決めることができません。より具体的には、を使用する部分で問題が発生します。あるいはもう一つのヒントが必要かもしれません。 – Dejvovo

+0

多分あなたは一般的なビューを持つことができますし、iframeやそのようなもののように、あなたのユーザーコントロールを置くことができます。 – ganchito55

関連する問題