2011-06-07 10 views
5

मैं एमईएफ एक्सटेंशन और एमवीवीएम पैटर्न के साथ प्रिज्म 4 का उपयोग कर रहा हूं। एक मॉड्यूल में प्रारंभ के दौरान मैं RegisterViewWithRegion (RegionNames.MyRegion, typeof (MyView)) जो काम करता है पूरी तरह से जब दृश्य इस तरह का निर्माण किया है कहते हैं:PRISM 4 - RegisterViewWithRegion और कस्टम निर्यात गुण

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public partial class MyView : UserControl 
{ 
    public MyView() 
    { 
    .... 

दृश्य पंजीकृत हो जाता है और सब कुछ ठीक है। जैसे ही मैं निर्यात को एक कस्टम निर्यात विशेषता में बदलता हूं, दृश्य अब और नहीं पाया जा सकता है, हालांकि यह अभी भी कंटेनर में है। यह कस्टम निर्यात गुण स्टॉक व्यापारी आरआई से लिया जाता है:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
[MetadataAttribute] 
public class ViewExportAttribute : ExportAttribute, IViewRegionRegistration 
{ 
    public ViewExportAttribute() 
     : base(typeof(object)) 
    { } 

    public ViewExportAttribute(string viewName) 
     : base(viewName, typeof(object)) 
    { 
     ViewName = viewName; 
    } 

    public string RegionName { get; set; } 
    public string ViewName { get; set; } 

} 

और इंटरफ़ेस

public interface IViewRegionRegistration 
{ 
    string RegionName { get; } 
    string ViewName { get; } 
} 

है बदल रहा है जब RegisterViewWithRegion बुला निर्यात

[ViewExport(ViewName = "MyView", RegionName = RegionNames.MyRegion)] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public partial class MyView : UserControl 
{ 
    public MyView() 
    { 
    .... 

करने की विशेषता यह एक त्रुटि फेंकता तक : MyView टाइप करने का प्रयास करते समय सक्रियण त्रुटि आई, "

कोई सलाह? मैं समाधान के बिना पूरे दिन कोड के इस हिस्से को देख रहा था।

+0

बाद में उस रात ... मुझे अंत में पता चला कि कस्टम निर्यात विशेषता में इस हिस्से के साथ कुछ करना है: ** आधार (टाइपऑफ (ऑब्जेक्ट)) ** - लेकिन अभी भी रजिस्टरव्यूविथरियन को हल करने का तरीका नहीं है समस्या ... – okieh

उत्तर

0

कस्टम निर्यात विशेषता बेस कन्स्ट्रक्टर को typeof(object) पास करती है, जो अनुबंध को बदलती है ताकि यह आयात से मेल नहीं खा सके। इसे बदलें ताकि यह पैरामीटर रहित कन्स्ट्रक्टर को कॉल कर सके।

जहां तक ​​सक्रियण त्रुटि आपको अधिक विस्तार से अपवाद को देखने की आवश्यकता होगी। मूल कारण शायद कहीं कहीं है, शायद इनर एक्सेप्शन के तहत दफन किया गया है।

4

एक और दिन, एक और तरीका ... मैं अपने प्रश्न का उत्तर देने की कोशिश करूंगा, भले ही मेरे पास PRISM के बारे में केवल सीमित ज्ञान हो। दूसरे शब्दों में: मैं अभी भी सीख रहा हूँ।

स्टॉक ट्रेड आरआई से लिया गया कस्टम निर्यात विशेषता AutoPopulateExportedViewsBehavior द्वारा उपयोग की जाती है। यह व्यवहार क्षेत्र के नाम के लिए निर्यात विशेषता को चेक करके स्वचालित रूप से अपने क्षेत्र में एक दृश्य जोड़ता है, फिर दृश्य को संबंधित क्षेत्र में जोड़ता है। लेकिन इस कस्टम विशेषता के साथ सभी विचारों में अब "ऑब्जेक्ट" का अनुबंध नाम है जो ServiveLocator को ढूंढना असंभव बनाता है। यह कस्टम विशेषता निश्चित क्षेत्र/दृश्य लिंक वाले परिदृश्य के लिए है। एक समाधान है जब एक कस्टम निर्यात गुण के साथ काम करने प्रकार के "वस्तु" सभी निर्यात और उचित मेटाडाटा प्राप्त करने के लिए है:

MyView view; 
var myList = container.GetExports<object, IViewRegionRegistration>(); 
foreach (Lazy<object, IViewRegionRegistration> lazy in myList) 
{ 
    if (lazy.Metadata.ViewName == "MyView") 
    { 
     view = lazy.Value as MyView; 
     region.Add(view); 
     break; 
    } 
} 

लेकिन मैं ViewInjection और प्रिज्म नेविगेशन का उपयोग करते समय बस का उपयोग करने के लिए डिफ़ॉल्ट [बेहतर है लगता है निर्यात] विशेषता, तो सब कुछ सुचारू रूप से काम करता है।

4

क्या आप अपने एमईएफ बूटस्ट्रैपर में कुल कैटलॉग को कॉन्फ़िगर कर रहे हैं? यदि हां, तो क्या आप उस असेंबली को जोड़ रहे हैं जिसमें आपका ViewExportAttribute और AutoPopulateExportedViewsBehavior क्लासेस शामिल हैं? मेरा मानना ​​है कि यह इस लाइन के साथ StockTraderRI के bootstrapper में क्या होता है:

this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StockTraderRICommands).Assembly)); 

StockTraderRICommands वर्ग ViewExportAttribute और AutoPopulateExportedViewsBehavior वर्गों के रूप में ही विधानसभा में है।

+0

मुझे मूल प्रश्नकर्ता के समान समस्या थी और यह समाधान था। – Dylan

0

मुझे बिल्कुल एक ही समस्या का सामना करना पड़ा और यह एमईएफ/PRISM शुरुआती के लिए कठिन था।okieh बहुत अच्छी तरह से समस्या का वर्णन है, मैं तो बस, एक वैकल्पिक समाधान पोस्ट करना चाहते हैं StocktraderUI नमूना आवेदन से आ रही:

समाधान काम करता है (/ काम करने के लिए लगता है) यदि आप कॉन्फ़िग फ़ाइल के किसी भी रूप के बिना देखें खोज करना चाहते हैं, आदि जहां आपको अपने विचार पंजीकृत करना होगा।

1. ViewExport कस्टम घटना

[Export] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
[MetadataAttribute] 
public sealed class ViewExportAttribute : ExportAttribute, IViewRegionRegistration 
{ 
    public ViewExportAttribute() 
     : base(typeof(UserControl)) 
    { } 

    public string ViewName { get { return base.ContractName; } } 

    public string RegionName { get; set; } 
} 

[निर्यात] विशेषता जोड़ दिया जाता है और आधार निर्माता अब UserControl बजाय object साथ कहा जाता है को संशोधित करें। इस तरह यह एमईएफ द्वारा खोजा जा सकता है।

2. संशोधित AutoPopulateExportedViewsBehavior

[ImportMany(typeof(UserControl))] 
public Lazy<UserControl, IViewRegionRegistration>[] RegisteredViews { get; set; } 

[ImportMany] विशेषता जोड़ दिया जाता है और लेज़ी initializiation के प्रकार UserControl करने के लिए बदल गया है। अब, सभी UserControl एस IViewRegionRegistration के साथ-साथ मेटाडेटा-प्रकार को कार्यान्वित किया जाता है।

यह मूल रूप से यह है। आप पहले के रूप में [ViewExport] का उपयोग कर सकते हैं। नोट, यह दृश्य UserControl के (उप) प्रकार तक सीमित हैं। मुझे लगता है कि अगर आप चाहते हैं तो इसे संशोधित किया जा सकता है। और सुनिश्चित करें कि आपके कुल सूची ViewExportAttribute और AutoPopulateExportedViewsBehavior आयात करता है, के रूप में निकोलस ने कहा कि आप अपने विचारों के लिए अतिरिक्त इंटरफेस की जरूरत नहीं है और अभी भी hardcoded पंजीकरण के बिना सब कुछ की खोज कर सकते हैं ...

इस तरह,।

मुझे आशा है कि इससे मदद मिलेगी और मुझे बताएं, अगर मुझे अपने समाधान की कोई कमी आई है।

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