Сброс элемента управления, загруженного с помощью MEF - PullRequest
2 голосов
/ 10 ноября 2010

Я использовал MEF для загрузки во внешние XAP, это прекрасно работает.Но когда я ухожу со страницы с загруженным элементом управления, а затем возвращаюсь к нему, элемент управления находится в том состоянии, в котором я его оставил.

Теперь иногда это замечательно, но не для проекта, над которым я работал.

Как мне вернуть элемент управления в исходное состояние?

Элемент управления загружен (успешно) в следующее:

 <ItemsControl x:Name="content"/>

Это в разметке XAML

У меня есть метод On NavigatedFrom:

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

Этот элемент успешно удалил элемент управления, как и до добавления этого, когда я вернулся на страницу, на которой произошел сбой, сообщив, что элемент управления уже был дочернимэлемент.

вот полный код страницы:

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
}

Кто-нибудь есть идеи?

Спасибо,

1 Ответ

1 голос
/ 10 ноября 2010

Простым решением было бы избежать всей проблемы, используя ExportFactory, а не Lazy: создайте новый экземпляр вместо повторного использования старого.Просто убедитесь, что сброшенные экземпляры получают GC'd вместо накапливания (РЕДАКТИРОВАТЬ: новые экземпляры передаются вам в экземплярах ExportLifetimeContext, которые управляют продолжительностью жизни объекта).старый ребенок все еще думает, что у него есть родитель.Прежде чем снова добавить его обратно в контейнер (желательно прямо в тот момент, когда вы его удаляете), вы должны сказать ему, что он теперь без родителей.UserControl.Parent доступен только для чтения.Может быть, вызвать RemoveLogicalChild на родителя?Я не проверял это, но общий проспект, похоже, стоит изучить, если каперса ExportFactory не плавает на вашей лодке.

...