2010-11-06 23 views
8

Ich hoffe, Sie sind alle wohlauf.Caliburn.Micro & Telerik WPF Kontrollen

Ich verwende Caliburn.Micro mit Telerik WPF-Steuerelementen, um eine Schnittstelle mit Registerkarten zu erstellen. Mit RadTabControl habe ich den folgenden Code;

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

Der Reiter hat den richtigen Header aber der Inhalt lesen „.../MyViewModel“ (Ellipsen vollständigen Pfad ersetzen) anstelle des Bildschirms, der angezeigt werden soll.

Wenn ich durch <TabControl... ersetze, funktioniert alles wie beabsichtigt.

Was fehlt mir?

Antwort

12

Das Konventionen-System von Caliburn ist nur für WPF-Steuerelemente konfiguriert, die sofort einsatzbereit sind. Wenn es das RabTabControl sieht, erkennt es es nicht, also suchte es seine Klassenhierarchie nach etwas, das es erkennt. In diesem Fall stimmt es wahrscheinlich mit Selector oder ItemsControl überein. Aus diesem Grund werden Konventionen teilweise angewendet. Um genau das zu bekommen, was Sie wollen, müssen Sie dem ConventionManager für RadTabControl eine Konvention hinzufügen, die genau das macht, was Sie wollen. Hier ist, wie die TabControl Konvention definiert:

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

Ich denke, Sie sollten den Code zu nehmen und mit ein paar kleinen Änderungen der Lage sein, es zu tun, was Sie wollen. Beachten Sie, dass einige der im obigen Code genannten Methoden tatsächlich im ConventionManager vorhanden sind. Daher müssen Sie dies beheben. Sie sollten Ihre Konvention in der Override-Konfiguration des Bootstrappers hinzufügen. Ein weiteres Beispiel hierfür ist der Bootstrapper der WP7-Vorlage, der benutzerdefinierte Konventionen für Pivot und Panarama definiert.

+1

Dieser der Trick. Vielen Dank. – Dan

4

Caliburn.Micro.Telerik enthält Konventionen für Teleriks WPF-Steuerelemente sowie einige andere Telerik + WPF-spezifische Elemente wie eine IWindowManager-Implementierung und zwei Anwendungen mit Beispielen.

Sie können die source code oder die nuget package überprüfen.

Die Konvention für RadTabControl sieht wie folgt aus:

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

Hope this helps ...

Verwandte Themen