2011-12-29 12 views
6

Mam utworzoną przez użytkownika funkcję UserControl, która importuje kilka części za pomocą atrybutu [Import].Używanie MEF w kontrolkach utworzonych z XAML

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

    public MyUserControl() 
    { 
    } 

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

Ten UserControl jest tworzony z XAML, więc jego import nie jest zadowolony i OnImportsSatisfied nie jest wywoływana.

<local:MyUserControl /> 

Moje pytanie brzmi: w jaki sposób mogę zaspokoić import mojej klasy, gdy jest ona tworzona w XAML.

+0

To może być trudne, ponieważ WPF zwykle rozładowuje kontrolki, które nie są widoczne, więc ta kontrola może istnieć tylko raz, ale może zostać załadowana i rozładowana wiele razy. – Rachel

+0

@Rachel, aby temu zapobiec, mógł użyć leniwego ładowania. –

+0

Czy na pewno chcesz to zrobić? Wygląda na to, że próbujesz wprowadzić logikę biznesową do kontroli interfejsu użytkownika. Co zawsze jest złe. – Euphoric

Odpowiedz

2

Od MSDN:

Do wystąpienia jako element obiektu w XAML, niestandardowej klasy musi spełniać następujące wymagania:
Klasa zwyczaj musi być publiczne i muszą wystawiać domyślne (bez parametrów) publiczne konstruktor. (Zobacz następującą sekcję dla uwag dotyczących struktur.)
Niestandardowa klasa nie może być klasą zagnieżdżoną. Dodatkowa "kropka" w ścieżce pełnej nazwy powoduje, że podział przestrzeni klas jest niejednoznaczny, a koliduje z innymi właściwościami XAML, takimi jak właściwości dołączone.
Jeśli obiekt może zostać utworzony jako element obiektu, utworzony obiekt może wypełnić formularz elementu właściwości wszelkich właściwości, które przyjmują obiekt jako typ bazowy.
Możesz nadal podawać wartości obiektów dla typów, które nie spełniają tych kryteriów, jeśli włączysz konwerter wartości o wartości . Aby uzyskać więcej informacji, zobacz Typy konwerterów i znaczników Rozszerzenia dla XAML.

Stamtąd, masz dwie możliwości:
1) przy użyciu TypeConverter:
użyciu konwertera typu pozwoli na instancję obiektu bez konstruktora bez parametrów, ale trzeba będzie zapewnić TypeConverter że zrobi instancję.

Teraz, nigdy nie musiałem tego używać, nie mogę ci w tym pomóc.

2) Pobierz IService pomocą ServiceLocator:

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

Zdaję sobie sprawę, że jest to zmiana w wyglądzie swojej klasie, ale mam nadzieję, że można sobie z tym poradzić.

Mam nadzieję, że to pomoże,

Bab.

0

Jeśli nie chcesz, aby mef tworzył kontrolę użytkownika, musisz użyć komponentu CompositionContainer w swoim kontrolerze użytkownika i zadzwonić bezpośrednio do GetExport. ale wtedy masz problem, aby uzyskać instancję swojego contcontainer :)

ps: Pozwól mi utworzyć moje widoki wpf w moich aplikacjach.