2010-11-06 5 views
8

Надеюсь, у вас все хорошо.Caliburn.Micro & Telerik Элементы управления WPF

Я использую Caliburn.Micro с элементами управления WPF Telerik для создания интерфейса с вкладками. Использование 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); 
}; 

Я думаю, что вы должны быть в состоянии взять код и с небольшими изменениями, сделать это делать то, что вы хотите. Обратите внимание, что некоторые из методов, вызываемых в приведенном выше коде, действительно существуют в консорциуме, поэтому вам нужно будет исправить это. Вы должны добавить свое соглашение в настройку перенастройки Bootstrapper. Для получения дополнительной выборки, посмотрите на Bootstrapper шаблона WP7, который определяет пользовательские соглашения для Pivot и Panarama.

+1

Это сделало трюк. Большое спасибо. – Dan

4

Caliburn.Micro.Telerik содержит соглашения для элементов управления WPF Telerik, а также некоторые другие теги Telerik + WPF, такие как реализация IWindowManager и два приложения с примерами.

Вы можете проверить source code или nuget 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; 
}; 

Надеется, что это помогает ...

Смежные вопросы