2010-11-06 18 views
8

Umarım iyisindir.Caliburn.Micro & Telerik WPF Kontrolleri

Sekmeli bir arabirim oluşturmak için Telerik'in WPF denetimleriyle Caliburn.Micro kullanıyorum. RadTabControl kullanarak aşağıdaki kodu var;

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

sekme doğru üstbilgi ancak içeriği ".../MyViewModel" yerine gösterilmesi gereken Ekranın (elips tam yolunu değiştirin) okuyun.

'u <TabControl... ile değiştirirseniz, bu her şey amaçlandığı şekilde çalışır.

Neyi eksik?

cevap

12

Caliburn'un sözleşmeler sistemi yalnızca kutunun dışında olan WPF denetimleri için yapılandırılmıştır. RabTabControl'ü gördüğünde, onu tanımaz, böylece sınıf hiyerarşisini tanımakta olduğu bir şeyi aramaktadır. Bu durumda, muhtemelen Selector veya ItemsControl üzerinde eşleşir. Bu nedenle, kısmi sözleşmelerin uygulanması vardır. Tam olarak ne istediğinizi elde etmek için, tam olarak istediğiniz şeyi yapan RadTabControl için ConventionManager'a bir sözleşme eklemeniz gerekir. İşte TabControl kongre nasıl tanımlandığını geçerli:

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

Sana kodu almak mümkün olması gerektiğini düşünüyorum ve birkaç küçük değişikliklerle, bu ne istersen yap olun. Yukarıdaki kodda aranan yöntemlerin bir kısmının, gerçekten de ConventionManager'da bulunduğunu unutmayın, bu yüzden düzeltmeniz gerekecek. Sözleşmenizi Bootstrapper'ın Yapılandırması geçersiz kılma işlemine eklemelisiniz. Bunun ek bir örneği için, Pivot ve Panarama için özel kurallar tanımlayan WP7 şablonunun Bootstrapper'ına bakın.

+1

Bu hile yaptı. Çok teşekkür ederim. – Dan

4

Caliburn.Micro.Telerik, Telerik'in WPF denetimlerinin yanı sıra bir IWindowManager uygulaması ve örneklerle iki uygulama gibi bazı diğer Telerik + WPF'ye özel kurallar için kurallar içerir.

source code veya nuget package'a bakabilirsiniz.

RadTabControl için kongre şuna benzer: Bu yardımcı olur

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

Umut ...