Silverlight ChildWindow не удаляется с помощью MEF и MVVM - PullRequest
1 голос
/ 29 января 2011

Я не уверен, что то, что я испытываю, такое же, как здесь: Утечка памяти ChildWindow Silverlight , но ...:

У меня есть Silverlight ChildWindow с 3переключатели в той же группе с IsChecked все установлены в false в XAML, я не хочу, чтобы какие-либо из них были выбраны при открытии.Я открываю окно ChildWindow из моей модели представления:

if (_NewChildWindowCommand == null)
    _NewChildWindowCommand = new RelayCommand(param => _cwService.ShowDialog(_newLocation, new NewViewModel(), closed =>
      {
          if (_newLocation.DialogResult.HasValue && _newLocation.DialogResult.Value)
          {
              //do something
          }
          _newLocation = null;
           _newLocation = _container.GetExportedValue<INewChildWindow>();
      }));

. Затем я выбираю одну из переключателей и нажимаю кнопку ОК.Он закрывается, я открываю его снова, и ChildWindow, кажется, был удален, так как при открытии ни одна из этих переключателей не выбрана (так, как это должно быть).Поэтому я снова выбираю переключатель, нажимаю ОК, он закрывается ... Но в третий раз, когда я открываю ChildWindow, у него выбирается тот же переключатель, что и при закрытии.Это то, что я не понимаю.Я подумал, установив _newLocation = null, как я сделал, и затем получив INewChildWindow из контейнера, я получу новое ChildWindow, но, похоже, это не так.Я попытался вызвать GC.Collect () после установки для _newLocation значения null, но это не сработало, и я попытался установить для PartCreationPolicy значение NonShared в ChildWindow, однако это не имеет значения, поскольку экземпляр ChildWindow хранится в_newLocation и класс, содержащий _newLocation, не утилизируется:

[ImportingConstructor]
public HomeViewModel(IChildWindowService cwService, INewLocationChildWindow newLocationChildWindow)
        {
            if (!IsDesignTime)
            {
                _cwService   = cwService;
                _newLocation = newLocationChildWindow;
                _catalog     = new AggregateCatalog();
                _catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
                _container   = new CompositionContainer(_catalog);
            }
        }

Есть ли здесь что-то еще?

1 Ответ

1 голос
/ 29 января 2011

Установите политику создания ChildWindow в NonShared.Затем замените _container.GetExportedValue<INewChildWindow>() на _container.GetExport<INewChildWindow>().Это даст вам Lazy<INewChildWindow>, и вы можете использовать свойство Value, чтобы получить дочернее окно.Затем, чтобы освободить экспортный вызов _container.ReleaseExport, передавая Ленивый, который был возвращен вызовом GetExport.

...