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

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

引言

正确结构:

Model <——> ViewModel <——> View

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

错误示范

出现的问题:

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

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不要创建强引用。

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 结构


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>

相关推荐

  1. wpf-MVVM定时可能出现内存泄漏问题

    2023-12-23 12:06:02       38 阅读
  2. 前端开发中可能出现内存泄漏情况总结

    2023-12-23 12:06:02       13 阅读
  3. WPF 界面命令定(MVVM结构)

    2023-12-23 12:06:02       18 阅读
  4. 深度探讨ThreadLocal是否真可能引发内存泄漏

    2023-12-23 12:06:02       33 阅读
  5. iOS 内存泄漏问题总结

    2023-12-23 12:06:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 12:06:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 12:06:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 12:06:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 12:06:02       20 阅读

热门阅读

  1. P5410 【模板】扩展 KMP/exKMP(Z 函数)

    2023-12-23 12:06:02       35 阅读
  2. Vue中的插槽和自定义指令

    2023-12-23 12:06:02       33 阅读
  3. 【安全】audit的一些问题以及需要注意的地方

    2023-12-23 12:06:02       42 阅读
  4. 二分查找(红蓝染色法)

    2023-12-23 12:06:02       45 阅读
  5. 使用QT实现RTSP视频流传输编程

    2023-12-23 12:06:02       42 阅读