【问题标题】:Silverlight ChildWindow not disposed using MEF and MVVMSilverlight ChildWindow 未使用 MEF 和 MVVM 处理
【发布时间】:2011-01-28 22:58:23
【问题描述】:

我不确定我遇到的情况是否与此处相同:Silverlight ChildWindow Memory Leak 但是...:

我有一个 Silverlight ChildWindow,在同一个组中包含 3 个单选按钮,并且在 XAML 中 IsChecked 全部设置为 false,我不希望在打开时选择其中任何一个。我从我的视图模型中打开 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 但似乎并非如此。在将 _newLocation 设置为 null 后,我尝试调用 GC.Collect() 但这不起作用,我尝试在 ChildWindow 上将 PartCreationPolicy 设置为 NonShared,但这并没有什么不同,因为 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);
            }
        }

这里还有其他事情吗?

【问题讨论】:

    标签: mvvm silverlight-4.0 mef dispose childwindow


    【解决方案1】:

    将 ChildWindow 的创建策略设置为 NonShared。然后将_container.GetExportedValue&lt;INewChildWindow&gt;() 替换为_container.GetExport&lt;INewChildWindow&gt;()。这将为您提供Lazy&lt;INewChildWindow&gt;,您可以使用Value 属性来获取子窗口。然后释放导出调用_container.ReleaseExport,传入调用GetExport返回的Lazy。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多