2011-12-29 49 views
6

我有一個用戶控件,我創建了它使用[Import]屬性導入多個零件。在從XAML實例化的控件中使用MEF

public class MyUserControl : UserControl, IPartImportsSatisfiedNotification 
{ 
    [Import] 
    public IService Service { get; set; } 

    public MyUserControl() 
    { 
    } 

    public void OnImportsSatisfied() 
    { 
     // Do something with Service. 
    } 
} 

該用戶控件從XAML實例化,所以它的進口沒有被滿足,OnImportsSatisfied不會被調用。

<local:MyUserControl /> 

我的問題是如何在XAML中創建類時能夠滿足我的類的導入。

+0

這可能很難做到,因爲WPF通常會卸載不可見的控件,所以此控件可能只存在一次,但可能會多次加載和卸載。 – Rachel 2011-12-29 13:13:14

+0

@Rachel爲了防止這種情況,他可以使用延遲加載。 – 2011-12-29 13:14:33

+0

你確定這是對的嗎?這看起來像是在試圖將業務邏輯放入UI控件中。這總是不好的事情。 – Euphoric 2011-12-29 17:37:07

回答

2

從MSDN:

要被實例化爲在XAML對象元素,定製類必須 滿足以下要求:
自定義類必須是公開的,並且必須暴露一個缺省(無參數)公共構造函數。 (有關結構,請參閱下面的註釋 )。
自定義類不能是嵌套類。全名路徑中的額外「點」使得類名稱空間劃分不明確,並且干擾其他XAML功能,例如附加屬性。
如果可以將對象實例化爲對象元素,則創建的對象 可以填充以 對象作爲其基礎類型的任何屬性的屬性元素形式。
如果啓用值轉換器 轉換器,您仍然可以爲不符合這些條件的類型提供對象值 。有關更多信息,請參閱Type Converters and Markup XAML的擴展。

從那裏,你有兩個選擇:
1)使用TypeConverter
使用一個類型轉換器將允許您實例化對象沒有參數的構造函數,但是你必須提供一個類型轉換器是將做實例化。

現在,我從來沒有使用它,我無法幫助你進一步。

2)使用服務定位檢索IService:

public class MyUserControl : UserControl 
{  
    public IService Service { get; set; } 

    public MyUserControl() 
    { 
     Service = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IService>(); 
     // You can do something with Service here already. 
    } 
} 

我意識到這是在你的類的設計變更,但希望你能應付它。

希望這會有所幫助,

Bab。

0

如果您不想讓mef創建您的usercontrol,則必須在您的usercontrol中使用compositioncontainer並直接調用GetExport。但那麼你有問題得到你的compositioncontainer的實例:)

ps:我讓mef在我的應用程序中創建我的wpf視圖。

相關問題