2010-11-06 40 views
8

Hy vọng tất cả các bạn đều tốt.Caliburn.Micro & Telerik WPF Điều khiển

Tôi đang sử dụng Caliburn.Micro với các điều khiển WPF của Telerik để tạo giao diện tab. Sử dụng RadTabControl Tôi có đoạn mã sau;

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

Tab có tiêu đề chính xác nhưng nội dung đọc ".../MyViewModel" (dấu ba chấm thay thế đường dẫn đầy đủ) thay vì Màn hình sẽ được hiển thị.

Nếu tôi thay thế <telerik:RadTabControl... bằng <TabControl..., tất cả đều hoạt động như dự định.

Tôi đang thiếu gì?

Trả lời

12

Hệ thống quy ước của Caliburn chỉ được định cấu hình cho các điều khiển WPF nằm ngoài hộp. Khi nó nhìn thấy RabTabControl, nó không nhận ra nó, do đó, nó tìm kiếm hệ thống phân cấp lớp của nó tìm kiếm một cái gì đó nó nhận ra. Trong trường hợp này, nó có thể phù hợp trên Selector hoặc ItemsControl. Đây là lý do tại sao có một phần áp dụng các quy ước. Để có được chính xác những gì bạn muốn, bạn cần thêm quy ước vào ConventionManager cho RadTabControl thực hiện chính xác những gì bạn muốn. Đây là cách quy ước của TabControl được xác định:

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

Tôi nghĩ rằng bạn có thể lấy mã và sửa đổi một vài, làm cho nó làm những gì bạn muốn. Lưu ý rằng một số phương thức được gọi trong mã trên thực sự tồn tại trên ConventionManager, vì vậy bạn sẽ cần phải sửa lỗi đó. Bạn nên thêm quy ước vào ghi đè Cấu hình của Bootstrapper. Đối với một mẫu bổ sung này, hãy xem Bootstrapper của mẫu WP7, xác định các quy ước tùy chỉnh cho Pivot và Panarama.

+1

này đã làm các trick. Cảm ơn nhiều. – Dan

4

Caliburn.Micro.Telerik chứa các quy ước cho điều khiển WPF của Telerik, cũng như một số công cụ cụ thể khác của Telerik + WPF như triển khai IWindowManager và hai ứng dụng có ví dụ.

Bạn có thể xem source code hoặc nuget package.

Quy ước cho RadTabControl trông như thế này:

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

Các vấn đề liên quan