WPF DataContent内存释放问题
来源:互联网 发布:辣木籽退伍军人淘宝 编辑:程序博客网 时间:2024/06/07 05:31
最近发现一个有趣的事,通过Window.dataContent来设置绑定以后,
窗体关闭以后 ViewModel 并没有释放,再次调用改窗体后,前一个ViewModel才释放,
或者是程序关闭以后才释放 ,搞不懂。。。
如果要马上释放ViewModel可以在Window关闭以后将DataContent 设置为null ,
这样ViewModel是可以释放的
下面是测试代码,大神请指教!
主窗体:
<Window x:Class="WeakViewModel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WeakViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Win1" HorizontalAlignment="Left" Margin="367,211,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<Button Content="GC" HorizontalAlignment="Left" Margin="128,211,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
</Grid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TestWindow win = new TestWindow();
win.Owner = this;
win.DataContext = ViewModel.Default;
win.Show();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
GC.Collect();
}
}
测试窗体:
<Window x:Class="WeakViewModel.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WeakViewModel"
mc:Ignorable="d"
Title="TestWindow" Height="300" Width="300">
<Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="96,111,0,0" TextWrapping="Wrap" Text="{Binding Path=Text}" VerticalAlignment="Top" Width="120"/>
</Grid>
</Window>
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
Closed += TestWindow_Closed;
}
~ TestWindow()
{
MessageBox.Show("释放TestWindow");
}
private void TestWindow_Closed(object sender, EventArgs e)
{
//注释这个行就能看出差别
DataContext = null;
}
}
测试ViewModel:
public class ViewModel
{
private static WeakReference _default = null;
private static object locker = new object();
public static ViewModel Default
{
get
{
if(_default==null||!_default.IsAlive)
{
lock (locker)
{
_default = new WeakReference(new ViewModel());
}
}
return _default.Target as ViewModel;
}
}
private ViewModel()
{
}
~ViewModel()
{
MessageBox.Show("释放 ViewModel"+Text);
}
private string _text = string.Empty;
public string Text
{
get
{
return _text;
}
set
{
_text = value;
}
}
}
- WPF DataContent内存释放问题
- WPF内存释放,C#
- WPF中的释放内存(持续添加中....)
- JS内存释放问题
- js 内存释放问题
- UIScrollview 内存释放问题
- Free()内存释放问题
- 内存的释放问题
- ffmpeg内存释放问题
- iframe内存释放问题
- 释放内存越界问题
- WPF的BitmapImage的文件无法释放及内存泄露的问题
- WPF的BitmapImage的文件无法释放及内存泄露的问题
- WPF的内存问题
- wpf内存泄漏问题
- wpf内存泄漏问题
- CvSeq 的内存释放问题
- 非模态对话框内存释放问题
- 世人爱情短命的原因分析
- 安装Ubuntu14.04系统后一些基本配置和软件安装
- delphi7 编译的程序在win7下请求获得管理员权限的方法
- leetcode Longest Palindromic Substring(Java)
- java中参数的传递问题
- WPF DataContent内存释放问题
- 【VS开发】MFC滑动条 CSliderCtrl
- css3媒体查询练习
- springmvc实现方法拦截,用户未登录不能访问
- MATLAB学习笔记 函数记录(一)
- 文章解析整理:《如果你还没搞懂LSTM 网络,那本文绝对值得一看》
- iscsi
- Tornado应用笔记01-简介
- linux安装jdk