wpf-MVVM绑定时可能出现的内存泄漏问题

文章速览

坚持记录实属不易,希望友善多金的码友能够随手点一个赞。
共同创建氛围更加良好的开发者社区!
谢谢~

引言

正确结构:

Model <------> ViewModel <------> View

但很多时候,很容易出现 View上直接引用Model数据的情况;当这种情况发生时,WPF将创建静态变量绑定源(即ViewModel)的强引用,导致内存泄漏。

错误示范

出现的问题:

此时,由于 view上绑定的数据 是直接到 model 上获取的,因此会造成内存泄漏的问题。

csharp 复制代码
class Model
{
	public int Age{get;set;}
	public string Name{get;set;}
	
	public Model(){}
}

public ViewModel
{
	public ObservableCollection<Model> ItemSource = new ObservableCollection<Model>();
	
	.....
}


xmal:

<ListView>
    <ListView.View>
        <GridView>
        	<GridViewColumn Header = "年龄" DisplayMemberBinding="{Binding Age}"/>
        	<GridViewColumn Header = "姓名" DisplayMemberBinding = "{Binding Name}"/>
        </GridView>
    </ListView.View>
</ListView>

示例1

在Xmal文件不变动的情况下;可以 ViewModel 套用ViewModel形式。

是否调用Propertychanged实际上不重要,重要是该类是从INotifyPropertyChanged派生的,因为这回告诉WPF不要创建强引用。

csharp 复制代码
class ViewModel2:INotifyPropertyChanged
{
	//propfull属性,实现INotifyPropertyChanged
	
	private int age;
	public int Age
	{
		get
		{
			return age;
		}
		set
		{
			age = value;
			PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Age)));
		}
	}
	
	public Model(){}
}

public ViewModel
{
	public ObservableCollection<ViewModel2> ItemSource = new ObservableCollection<ViewModel2>();
	
	.....
}


xmal:

<ListView>
    <ListView.View>
        <GridView>
        	<GridViewColumn Header = "年龄" DisplayMemberBinding="{Binding Age}"/>
        	<GridViewColumn Header = "姓名" DisplayMemberBinding = "{Binding Name}"/>
        </GridView>
    </ListView.View>
</ListView>

示例2

会极大的破坏mvvm结构,在功能较小时,可以试用

使用 T:ObservableCollection 结构

csharp 复制代码
public ViewModel:ObservableCollection<ViewModel>
{
//此时具有列表的属性
	public int Age{get;set;}
	public string Name{get;set;}
}


xmal.cs:

ViewModel ViewModel = new ViewModel();
//初始化时
listView.ItemsSource = ViewModel;


xmal:

<ListView x:Name = "listVeiw">
    <ListView.View>
        <GridView>
        	<GridViewColumn Header = "年龄" DisplayMemberBinding="{Binding Age}"/>
        	<GridViewColumn Header = "姓名" DisplayMemberBinding = "{Binding Name}"/>
        </GridView>
    </ListView.View>
</ListView>
相关推荐
界面开发小八哥6 小时前
界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?
.net·wpf·界面控件·devexpress·ui开发
I'mSQL6 小时前
C#与WPF使用mvvm简单案例点击按钮触发弹窗
开发语言·c#·wpf
百锦再1 天前
WPF依赖属性深度解析:从原理到高级应用
wpf·依赖·绑定·验证·net·强制
✎ ﹏梦醒͜ღ҉繁华落℘1 天前
WPF高级学习(一)
学习·wpf
界面开发小八哥1 天前
界面控件DevExpress WPF v25.1新版亮点:模板库更新升级
ui·.net·wpf·界面控件·devexpress·ui开发
△曉風殘月〆2 天前
WPF MVVM进阶系列教程(二、数据验证)
wpf·mvvm
JosieBook2 天前
【开源】WpfMap:一个基于WPF(Windows Presentation Foundation)技术构建的数据可视化大屏展示页面
信息可视化·wpf
bianguanyue2 天前
WPF——自定义ListBox
c#·wpf
大曰编程2 天前
行为型模式-协作与交互机制
wpf·交互
上元星如雨4 天前
WPF 项目设置应用程序图标和设置程序集图标
wpf