2010-11-06 16 views
8

आशा है कि आप सब ठीक हैं।कैलिबर्न। मिक्रो और टेलीरिक डब्ल्यूपीएफ नियंत्रण

मैं कैलिबर्न का उपयोग कर रहा हूं। टेलीबिक के 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" स्क्रीन कि प्रदर्शित किया जाना चाहिए के बजाय (दीर्घवृत्त पूरा पथ की जगह)।

यदि मैं <TabControl... के साथ प्रतिस्थापित करता हूं तो यह सभी कार्य करता है।

मैं क्या याद आ रही है?

उत्तर

12

कैलिबर्न की सम्मेलन प्रणाली केवल डब्ल्यूपीएफ नियंत्रणों के लिए कॉन्फ़िगर की गई है जो कि आउट ऑफ़ द बॉक्स हैं। जब यह RabTabControl को देखता है, तो यह इसे पहचान नहीं पाता है, इसलिए इसने कक्षा के पदानुक्रम की खोज की जो कुछ पहचानता है उसे ढूंढता है। इस मामले में, यह शायद चयनकर्ता या आइटम नियंत्रण पर मेल खाता है। यही कारण है कि सम्मेलनों का आंशिक आवेदन है। आप जो चाहते हैं उसे ठीक करने के लिए, आपको 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); 
}; 

मुझे लगता है कि आप कोड लेने के लिए सक्षम होना चाहिए और कुछ मामूली संशोधनों के साथ, यह आप क्या चाहते हैं करते हैं। ध्यान दें कि उपरोक्त कोड में बुलाए गए कुछ तरीकों वास्तव में कन्वेंशन मैनेजर पर मौजूद हैं, इसलिए आपको इसे ठीक करने की आवश्यकता होगी। आपको अपने बूटस्ट्रैपर के कॉन्फ़िगर ओवरराइड में अपना सम्मेलन जोड़ना चाहिए। इसके अतिरिक्त नमूने के लिए, WP7 टेम्पलेट के बूटस्ट्रैपर पर एक नज़र डालें, जो पिवोट और पैनारमा के लिए कस्टम सम्मेलनों को परिभाषित करता है।

+1

यह चाल किया था। आपका बहुत बहुत धन्यवाद। – Dan

4

कैलिबर्न.मिक्रो.Telerik में टेलीरिक के डब्ल्यूपीएफ नियंत्रणों के साथ-साथ कुछ अन्य टेलीरिक + डब्ल्यूपीएफ विशिष्ट सामान जैसे 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; 
}; 

आशा इस मदद करता है ...

संबंधित मुद्दे