jenswinter.com
Software Development 24/7

Einführung in das Managed Extensibility Framework (Teil 4)

October 9, 2008 20:35 by Jens
Bisherige Artikel der Serie:


Das Beispiel dieser Serie ist noch nicht flexibel genug. Im Hauptfenster ist festgelegt, dass das TabControl drei Seiten enthält:

DataContext = new List<object>
                  {
                      new {Title = "Page 1", Page = Page1},
                      new {Title = "Page 2", Page = Page2},
                      new {Title = "Page 3", Page = Page3}
                  };


Viel besser wäre es doch, wenn eine beliebige Anzahl von Seiten dargestellt werden können.

Das MEF bietet diese Möglichkeit. Es ist in der Lage, mehrere Komponenten, die denselben Contract haben, in eine Collection zu importieren. Das bedeutet zunächst, die Export-Contracts der UserControls müssen angepasst werden, sodass sie alle gleich lauten:

[Export("Page")]
public partial class Page1 : UserControl
{
    public Page1()
    {
        InitializeComponent();
    }
}

[Export("Page")]
public partial class Page2 : UserControl
{
    public Page2()
    {
        InitializeComponent();
    }
}

[Export("Page")]
public partial class Page2 : UserControl
{
    public Page2()
    {
        InitializeComponent();
    }


Diese UserControls können nun in eine Collection importiert werden. Dazu wird die Deklaration der Imports geändert. Die Member "Page1", "Page2" und "Page3" können entfernt werden und durch die Deklaration des Members "Pages" ersetzt werden:

[Import("Page")]
public ExportCollection<UserControl> Pages; 


Dadurch wird der CompositionContainer angewiesen, alle Komponenten mit dem Contract "Page" zu importieren. Über die ExportCollection<T>-Klasse haben wir wieder Zugriff auf die Metadaten der Exports. Die Seiten können nun wie folgt für den DataContext ausgewertet werden:

DataContext = from p in Pages
              select new {Title = p.Metadata["Title"], Page = p.GetExportedObject()};

              
Nun werden beliebig viele UserControls, die mit den entsprechenden Attributen versehen sind, in das TabControl geladen.

Der Quelltext der Beispiel-Anwendung kann hier heruntergeladen werden.

Related posts

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

January 7. 2009 09:58