2010-11-06 10 views
8

Mam nadzieję, że wszystko w porządku.Caliburn.Micro i Telerik Kontrola WPF

Używam Caliburn.Micro z elementami sterującymi WPF Telerik do budowania interfejsu z kartami. Za pomocą RadTabControl mam następujący kod;

<telerik:RadTabControl x:Name="Items" Grid.Row="1" TabStripPlacement="Bottom"> 
    <telerik:RadTabControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding DisplayIcon}" Width="16" Height="16"/> 
       <TextBlock Text="{Binding DisplayName}"/> 
      </StackPanel> 
     </DataTemplate> 
    </telerik:RadTabControl.ItemTemplate> 
</telerik:RadTabControl> 

Zakładka ma prawidłową nagłówek ale zawartość czytać „.../MyViewModel” (elipsy zastąpić pełną ścieżkę) zamiast ekranu, które powinny być wyświetlane.

Jeśli zastąpię <telerik:RadTabControl... przez <TabControl..., wszystko działa zgodnie z przeznaczeniem.

Czego mi brakuje?

Odpowiedz

12

System konwencji Caliburn jest skonfigurowany tylko dla formantów WPF, które są gotowe do użycia. Kiedy widzi RabTabControl, nie rozpoznaje go, więc przeszukał hierarchię klas szukając czegoś, co rozpoznaje. W tym przypadku prawdopodobnie pasuje do Selectora lub ItemsControl. Właśnie dlatego istnieje częściowe stosowanie konwencji. Aby uzyskać dokładnie to, czego potrzebujesz, musisz dodać konwencję do aplikacji ConventionManager dla RadTabControl, która wykonuje dokładnie to, co chcesz. Oto jak konwencja TabControl jest zdefiniowana:

AddElementConvention<TabControl>(TabControl.ItemsSourceProperty, "ItemsSource", "SelectionChanged") 
.ApplyBinding = (viewModelType, path, property, element, convention) => { 
    if(!SetBinding(viewModelType, path, property, element, convention)) 
     return; 

    var tabControl = (TabControl)element; 
    if(tabControl.ContentTemplate == null && tabControl.ContentTemplateSelector == null && property.PropertyType.IsGenericType) { 
     var itemType = property.PropertyType.GetGenericArguments().First(); 
     if(!itemType.IsValueType && !typeof(string).IsAssignableFrom(itemType)) 
      tabControl.ContentTemplate = DefaultItemTemplate; 
    } 

    ConfigureSelectedItem(element, Selector.SelectedItemProperty, viewModelType, path); 

    if(string.IsNullOrEmpty(tabControl.DisplayMemberPath)) 
     ApplyHeaderTemplate(tabControl, TabControl.ItemTemplateProperty, viewModelType); 
}; 

Myślę, że powinieneś być w stanie podjąć kod iz kilkoma niewielkimi modyfikacjami, sprawiają, że to, co chcesz. Zauważ, że niektóre metody wywoływane w powyższym kodzie faktycznie istnieją w menedżerze konwencji ConventionManager, więc będziesz musiał to naprawić. Powinieneś dodać swoją konwencję do nadpisania Konfiguracji Bootstrappera. Aby uzyskać dodatkową próbkę tego, spójrz na Bootstrapper szablonu WP7, który definiuje niestandardowe konwencje dla Pivot i Panarama.

+1

To załatwiło sprawę. Dziękuję Ci bardzo. – Dan

4

Caliburn.Micro.Telerik zawiera konwencje dla elementów sterujących WPF Telerika, a także niektóre inne elementy związane z Telerik + WPF, takie jak implementacja IWindowManager i dwie aplikacje z przykładami.

Możesz sprawdzić source code lub nuget package.

Konwencja RadTabControl wygląda następująco:

ConventionManager.AddElementConvention<RadTabControl>(RadTabControl.ItemsSourceProperty, 
                "ItemsSource", 
                "SelectionChanged") 
.ApplyBinding = (viewModelType, path, property, element, convention) => 
{ 
    if (!ConventionManager.SetBindingWithoutBindingOrValueOverwrite(viewModelType, 
                    path, 
                    property, 
                    element, 
                    convention, 
                    RadTabControl.ItemsSourceProperty)) 
     return false; 

    var tabControl = (RadTabControl) element; 
    if (tabControl.ContentTemplate == null 
     && tabControl.ContentTemplateSelector == null 
     && property.PropertyType.IsGenericType) 
    { 
     var itemType = property.PropertyType.GetGenericArguments().First(); 
     if (!itemType.IsValueType && !typeof (string).IsAssignableFrom(itemType)) 
      tabControl.ContentTemplate = ConventionManager.DefaultItemTemplate; 
    } 
    ConventionManager.ConfigureSelectedItem(element, 
              RadTabControl.SelectedItemProperty, 
              viewModelType, 
              path); 

    if (string.IsNullOrEmpty(tabControl.DisplayMemberPath)) 
     ConventionManager.ApplyHeaderTemplate(tabControl, 
               RadTabControl.ItemTemplateProperty, 
               RadTabControl.ItemTemplateSelectorProperty, 
               viewModelType); 
    return true; 
}; 

Nadzieja to pomaga ...

Powiązane problemy