2011-06-07 29 views
5

Ben MEF Uzantıları ve MVVM desenli Prism 4 kullanıyorum Özellikleri. Bir modülde başlatma sırasında görünümü böyle inşa edilmiştir mükemmel çalışır RegisterViewWithRegion (RegionNames.MyRegion typeof (MyView)) çağırır:PRISM 4 - RegisterViewWithRegion & Özel İhracat

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

görünümü kayıtlı ve her şey gayet iyi olur. İhracatı Özel Dışarı Aktarım Özelliği'ne değiştirir değiştirmez, görünüm yine de bulunamaz, ancak yine de kapsayıcıdadır. Bu Özel İhracat Özellik Stok Trader RI alınır:

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

} 

ve arayüz RegisterViewWithRegion çağrılırken İhracat bunun bir hata atar

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

için Özellik değiştirerek

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

olduğunu : MyView türünün örneğini almaya çalışırken etkinleştirme hatası oluştu, ""

Herhangi bir tavsiye? Bir çözüm bulamadan bütün gün bu kod bölümüne bakıyordum.

+0

O gecenin ilerleyen saatlerinde ... Sonunda Özel İhraç Niteliğinde bu bölümle ilgili bir şey olduğunu öğrendim: ** base (typeof (object)) ** - ama hala RegisterViewWithRegion'u nasıl çözeceğine dair hiçbir bilgi yok. sorun ... – okieh

cevap

0

özel ihracat nitelik artık ithalat eşleşecek şekilde ihraç sözleşme değişiklikleri temel kurucu için typeof(object) geçer. Değiştirin, böylece parametresiz yapıcıyı çağırır.

Bildiğim kadarıyla daha ayrıntılı olarak istisna bakmak gerekir aktivasyon hatası olarak. Kök neden muhtemelen bir yerde, belki de bir InnerException altında gömülüdür.

4

Başka bir gün, başka bir yol ... Ben sadece PRISM hakkında sınırlı bilgiye sahip olsa da soruma cevap çalışacağım. Başka bir deyişle: Hala öğreniyorum.

Stok Ticaret RI alınan Özel İhracat Özellik

AutoPopulateExportedViewsBehavior tarafından kullanılır. Bu davranış, bölge adına Öznitelik Dışa Aktar'ı işaretleyerek otomatik olarak bölgeye bir görünüm ekler ve sonra görünümü ilgili bölgeye ekler. Ancak, bu Özel Öznitelikteki tüm görünümlerin artık ServiveLocator'un bunları bulmasını imkansız kılan bir "sözleşme" sözleşme adı vardır. Bu Özel Özellik, sabit bölge/görünüm bağlantılarına sahip bir senaryo içindir. bir çözüm bir Özel İhracat Özelliğine Sahip Olan çalışma "nesne" türdeki tüm ihracatını ve uygun meta verileri elde etmektir:

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

Ama sadece varsayılan [kullanmaya ViewInjection ve Prizma Navigasyon daha iyi olduğunu kullanırken düşünüyorum Export] özniteliği, sonra her şey sorunsuz çalışır.

4

Eğer MEF Önyükleyici agrega katalog yapılandırılması musunuz? Öyleyse, ViewExportAttribute ve AutoPopulateExportedViewsBehavior sınıflarınızı içeren derlemeyi mi ekliyorsunuz? Bunun bu hat ile StockTraderRI en Önyükleyici olur inanıyoruz:

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

StockTraderRICommands sınıf ViewExportAttribute ve AutoPopulateExportedViewsBehavior sınıfları aynı derlemede yer almaktadır.

+0

Orijinal askerle aynı sorunu yaşadım ve bu çözümdü. – Dylan

0

Tam olarak aynı problemle karşılaştım ve MEF/PRISM acemi için zor bir durumdu.okieh Sadece StocktraderUI örnek uygulaması gelen alternatif bir çözüm göndermek istediğiniz çok iyi sorun açıklanır:

çözüm, yapılandırma dosyasında herhangi bir biçimde Görüntüle keşif istiyorsanız (/ iş gibi görünüyor) işleri

, vb. görüntülerinizi kaydetmeniz gereken yerler.

1.

ViewExport özel olayı

[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; } 
} 
[İhracat] özelliğinin eklenir

ve taban Şimdi yapıcı UserControl yerine object çağrılır değiştirin. Bu şekilde MEF tarafından keşfedilebilir.

2. Değiştir AutoPopulateExportedViewsBehavior

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

[ImportMany] özelliği ilave edilir ve Tembel Initializiation tipi UserControl değiştirilir. Şimdi, tüm UserControl s, IViewRegionRegistration ile uyumlu MetaData türünde içe aktarılıyor.

Temel olarak bu. [ViewExport]'u daha önce olduğu gibi kullanabilirsiniz. Notların, UserControl (alt) türleriyle sınırlı olduğunu unutmayın. İsterseniz bu değiştirilebilir. Ve görünümlerinizde için ek arayüzleri gerek yoktur ve yine kodlanmış kayıt olmadan her şeyi bulabilir,

Bu şekilde ... Nicolaus söylediği gibi senin agrega katalog, ViewExportAttribute ve AutoPopulateExportedViewsBehavior ithal emin olun.

Umarım çözümün herhangi bir sakıncasını kaçırırsam, bana yardımcı olur.