【问题标题】:Destroy view while using ContentPresenter in wpf with DataTemplate在 wpf 中使用 ContentPresenter 和 DataTemplate 时销毁视图
【发布时间】:2015-09-03 07:37:13
【问题描述】:

我目前正在使用 ContentPresenter 在 UserControl 中显示不同的视图,如下所示:

 <ContentPresenter Content="{Binding ContentSourceVm}"/>

设置为 ContentSourceVm 的每个值都映射到 DataTemplates:

 <DataTemplate DataType="{x:Type adminViewModel:AdminAccountViewModel}">
    <administration:AdminAccountView/>
 </DataTemplate>
 <DataTemplate DataType="{x:Type adminViewModel:AdminCalibrationViewModel}">
    <administration:AdminCalibrationView/>
 </DataTemplate>

当我将新 VM 设置为 ContentSourceVm 时,视图已正确更改,但不幸的是,即使经过一定时间后第一个视图也没有释放。 (上一个视图的析构函数没有被调用)

管理此问题的最佳做法是什么?

我一直在寻找使用 DataTemplateSelector 的解决方案,但没有成功。 我已经看到了一些示例,它使用信使发送视图类型,以在处置此视图模型期间释放与视图模型关联的视图,但我不想在我的 VM 和我的视图之间创建强关系。

谢谢!

【问题讨论】:

    标签: c# wpf memory datatemplate


    【解决方案1】:

    在 ViewModel 中,在使用新的视图模型更改视图模型之前,处置当前的视图模型:

    private _contentSourceVm;
    prop ContentSourceVm
    {
      get
       {
         return _contentSourceVm;
       }
      set
       {
         IDisposable disp=_contentSourceVm as IDisposable ;
         if(disp!=null)
         {
          disp.Dispose();
         }
         _contentSourceVm=value;
         OnpropertyChnaged();
       }
    }
    

    【讨论】:

    • 感谢您的回答,我已经尝试处理从IDisposable继承的viewModel,正确调用了Dispose方法但视图的Finalizer没有
    • Finalize :允许对象在被垃圾收集回收之前尝试释放资源并执行其他清理操作。但你无法预测收集器何时会采取行动。
    猜你喜欢
    • 1970-01-01
    • 2016-12-06
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多