2009-05-09 13 views
24

मैं एक तानाना ढांचे के रूप में MEF देख रहा था, और मैं काफी एक बिंदु के अलावा, बेचा हूँ:एक WPF डेटा टेम्पलेट आयात करने के लिए MEF का उपयोग करना?

मान लीजिए कि मैं दोनों एक ViewModel और यह प्रदर्शित करने के लिए एक दृश्य के लिए आयात करना चाहते हैं। मुझे लगता है कि ऐसा करने का "सही" तरीका एमईएफ भाग के लिए एक व्यूमोडेल क्लास निर्यात करने के लिए है, और एक डेटा टेम्पलेट जो व्यूमोडेल प्रदर्शित करता है। उदाहरण के तौर पर, कहें कि आप एक Visio- जैसे एप्लिकेशन बना रहे थे और आप आकृतियों की एक लाइब्रेरी आयात करना चाहते हैं। प्रत्येक आकृति को Xaml और एक ViewModel में परिभाषित एक दृश्य की आवश्यकता होती है जो कुछ अंतर्निहित मॉडल ऑब्जेक्ट को लपेटती है।

क्या यह संभव है? डेटा टेम्पलेट के लिए आयात अनुबंध कैसा दिखता है और मैं आयातित डेटा टेम्पलेट के बारे में डब्ल्यूपीएफ को कैसे जागरूक करता हूं?

[ImportMany("ApplicationResources", typeof(ResourceDictionary))] 
    public IEnumerable<ResourceDictionary> Views { get; set; } 

तब मेरे समग्र भाग में, मैं एक ViewModel की घोषणा की:

मेरी मेजबान WPF आवेदन में, मैं इस आयात कहा:

उत्तर

39

हाँ, मैं निम्नलिखित तरीके से इस काम करने के लिए कर रहा था , और नियमित संसाधन डैम फ़ाइल में ViewModel के लिए डेटा टेम्पलेट।

[Export("ApplicationResources", typeof(ResourceDictionary))] 
public partial class ItemView : ResourceDictionary 
{ 
    public ItemView() 
    { 
     InitializeComponent(); 
    } 
} 

संदर्भ के लिए, Xaml उदाहरण के लिए ResourceDictionary इस तरह दिखता है: तो फिर मैं (इस उदाहरण में, ViewModel ItemViewModel कहा जाता है और ResourceDictionary ItemView कहा जाता है) ResourceDictionary के लिए पीछे एक कोड बनाया, इस तरह:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyCompany.MyProduct" 
    x:Class="MyCompany.MyProduct.ItemView"> 

    <DataTemplate DataType="{x:Type local:ItemViewModel}"> 
     ... 
    </DataTemplate> 

</ResourceDictionary> 
फिर

, वापस मेरी मेजबान WPF आवेदन में, के बाद मैं सफलतापूर्वक लिखें और इससे पहले कि मैं मुख्य विंडो दिखाने के लिए, मैं यह कर:

// Add the imported resource dictionaries 
// to the application resources 
foreach (ResourceDictionary r in Views) 
{ 
    this.Resources.MergedDictionaries.Add(r); 
} 

ऐसा लगता है कि कहीं भी डेटा टेम्पलेट को सफलतापूर्वक लागू करने के लिए WPF एक आइटम व्यूमोडेल देखता है।

संपादित: जो कोई रुचि है के लिए, मैं एक आवेदन ढांचे SoapBox Core खुला के रूप में स्रोत जारी किया है, और यह इस पद्धति का बड़े पैमाने पर उपयोग करता है आवेदन संसाधनों में दृश्य आयात करने के लिए। यह बहुत अच्छी तरह से काम करता है, और आप स्वयं स्रोत डाउनलोड कर सकते हैं और यह देख सकते हैं कि यह कैसे काम करता है।

+0

मैंने इस सटीक दृष्टिकोण की कोशिश की लेकिन संसाधन समय लोड समय पर खाली है। क्या प्रारंभिकरण को मजबूर करने का कोई तरीका है या क्या मैं कुछ गलत कर रहा हूं? –

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