2010-11-06 86 views
8

希望你一切都好。Caliburn.Micro&Telerik WPF控件

我正在使用Caliburn.Micro和Telerik的WPF控件構建一個選項卡式界面。使用RadTabControl我有以下代碼;

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

該卡具有正確的標題,但內容爲:「....../MyViewModel」(省略號代替完整路徑),而不是應顯示在屏幕上。

如果我將<telerik:RadTabControl...替換爲<TabControl...,這一切都按預期工作。

我錯過了什麼?

回答

12

Caliburn的約定系統僅針對開箱即用的WPF控件進行配置。當它看到RabTabControl時,它不能識別它,所以它搜索它的類層次結構以尋找它認可的東西。在這種情況下,它可能與Selector或ItemsControl匹配。這就是爲什麼部分應用公約。爲了得到你想要的,你需要在ConventionManager中爲RadTabControl添加一個約定,該約定完全符合你的要求。這裏是TabControl的慣例是如何定義的:

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

我想你應該能夠採取的代碼,並與一些小的修改,讓它做你想做的。請注意,以上代碼中調用的一些方法實際上存在於ConventionManager中,因此您需要修復這些問題。您應該將您的約定添加到Bootstrapper的配置覆蓋中。有關這方面的其他示例,請查看WP7模板的Bootstrapper,它定義了Pivot和Panarama的自定義約定。

+1

這並獲得成功。非常感謝你。 – Dan 2010-11-06 15:57:51

4

Caliburn.Micro.Telerik包含Telerik的WPF控件的約定,以及一些其他Telerik + WPF特定的東西,如IWindowManager實現和兩個帶有示例的應用程序。

您可以查看source codenuget package

爲RadTabControl的約定如下:

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

希望這有助於...