2016-03-23 19 views
0

Her bir modülün (.dll) bir ana UserControl içerdiği modül tabanlı bir uygulamam var. Modüller yalnızca gerektiğinde yüklenir ve UserControls bir MainWindow'a eklenir. Ana pencere, modüllerin UserControl'lerini yerleştirmek için AvalanDock [2.0] kullanıyor. Şimdiye kadar bu şekilde yapıyorum:Dinamik olarak yüklenen UserControl'leri AvalanDock MVVM yoluna ekle

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); 
} 

Bu model Ben bir UserControl ViewModel bir layoutDocument bir başlığı bağlamak ister kapanış olayları vb işlemek istiyorum mesela çok kısıtlayıcı olduğunu .. Bu nedenle MVVM desenini kullanmak istiyorum.

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

Ancak orada modüllerin bir sürü ve ana penceresi yalnızca bazı ortak atalara sahip olduğunu bilmelidir, şu şekildedir: Tipik kullanım görünüyor. Bu nedenle, LayoutItemTemplateSelector'daki tüm UserControl'leri listeleyemiyorum. Sahip olduğum şey, bir UserControls listesi.

MVVM'yi dinamik olarak yüklenmiş UserControls ile kullanma hakkında herhangi bir fikriniz var mı? Benim durumumda

cevap

0

, ben:

public ObservableCollection<EditorViewModel> Documents { get; } 

XAML içinde

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

Sonra

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

Sonunda başlık için bağlamaları koymak

o ViewModel görüntüle ne demek ve diğer özellikler:

<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> 

Benim görüşüme göre bağlamalar için temel bir ViewModel'e sahip olabilirsiniz ve her kullanıcı denetimi bunu genişletebilir.

Umarım bu size yardımcı olabilir.

+0

Aşağıdaki sorunun olduğunu düşünüyorum: AvalanDock, ViewModel'i temel alan görünümü seçer. Bu nedenle, tüm ViewControl'lerim için genel ViewModel kullanırsam, AvalanDoock hangi Görünümü seçeceğine karar veremezdi. Daha somut olarak kullandığınız kısımdaki problemi görüyorum. Ya da belki bir daha ipucuna ihtiyacım var. – Dejvovo

+0

Belki genel bir View'a sahip olabilirsiniz ve daha sonra kullanıcı kontrolünüzü bir iframe veya bunun gibi bir şey gibi koyabilirsiniz. – ganchito55

İlgili konular