2 Stimmen

Zurücksetzen einer mit MEF geladenen Steuerung

Ich habe MEF verwendet, um externe XAPs zu laden, das funktioniert hervorragend. Aber wenn ich die Seite mit dem geladenen Steuerelement verlasse und dann zurückkehre, ist das Steuerelement genau in dem Zustand, in dem ich es verlassen habe.

Manchmal ist das großartig, aber nicht für das Projekt, an dem ich arbeite.

Wie setze ich das Steuerelement in seinen Ausgangszustand zurück?

Das Steuerelement wird (erfolgreich) hierher geladen:

 <ItemsControl x:Name="content"/>

Dies ist in der XAML-Auszeichnung

Ich habe eine On NavigatedFrom-Methode:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    content.Items.Clear();
}

Dies erfolgreich entfernt das Steuerelement, wie vor dem Hinzufügen dieser, wenn ich zurück zu der Seite ging es stürzte sagen mir das Steuerelement war bereits ein Kind eines Elements.

Hier ist der vollständige Seitencode:

public partial class Wizard : IPartImportsSatisfiedNotification
{
    public Wizard()
    {
        InitializeComponent();
        CompositionInitializer.SatisfyImports(this);

        var controlToLoad = IsolatedStorageHelper.GetValue("control");

        if (!String.IsNullOrEmpty(controlToLoad))
        {
            CatalogService.AddXap(controlToLoad + ".xap");
        }
    else
    {
        NavigationService.Navigate(new Uri("/ServiceSelector", UriKind.Relative));
    }
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    content.Items.Clear();
}

[Import]
public IDeploymentCatalogService CatalogService { get; set; }

[ImportMany(AllowRecomposition = true)]
public Lazy<UserControl>[] MefModuleList { get; set; }

#region IPartImportsSatisfiedNotification Members

public void OnImportsSatisfied()
{
    MefModuleList.ToList()
        .ForEach(module =>
            content.Items.Add(module.Value)
        );
}

#endregion
}

Hat jemand eine Idee?

Danke,

1voto

Eine einfache Lösung wäre, das ganze Problem durch die Verwendung von ExportFactory statt Lazy zu vermeiden: Erstellen Sie eine neue Instanz, anstatt die alte wieder zu verwenden. Stellen Sie einfach sicher, dass die verworfenen Instanzen GC'd erhalten, anstatt sich zu stapeln (EDIT: Die neuen Instanzen werden Ihnen in ExportLifetimeContext Instanzen übergeben, die die Lebensdauer des Objekts verwalten).

Was jetzt schief läuft, hört sich so an, als ob das alte Kind immer noch denkt, dass es ein Elternteil hat. Bevor Sie es wieder in den Container aufnehmen (am besten genau an dem Punkt, an dem Sie es entfernen), müssen Sie ihm sagen, dass es jetzt elternlos ist. UserControl.Parent ist allerdings schreibgeschützt. Vielleicht RemoveLogicalChild auf dem Parent aufrufen? Ich habe das nicht getestet, aber der allgemeine Weg scheint es wert zu sein, erforscht zu werden, wenn die ExportFactory Kapriolen nicht Ihr Boot schweben.

0 Stimmen

Haben Sie ein Beispiel für diese, wie ich folgte ein toturoial für die oben und havent hatte viel Gelegenheit, um MEF noch lesen :(

0 Stimmen

Die ExportFactory-Vorlage wird genau so verwendet wie Lazy. Dieselben Parameter: Entweder nur der importierte Typ oder der importierte Typ gefolgt von dem Metadatentyp. Um Instanzen daraus zu erhalten, würden Sie statt module.Value module.CreateExport() verwenden. ExportFactory<T>.CreateExport() gibt ExportLifetimeContext<T> zurück, der die Lebensdauer des fraglichen Objekts verwaltet. Die eigentliche T-Instanz befindet sich in der Eigenschaft Value.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X