wpf-MVVM绑定时可能出现的内存泄漏问题
2023-12-22 18:35:04
坚持记录实属不易,希望友善多金的码友能够随手点一个赞。
共同创建氛围更加良好的开发者社区!
谢谢~
引言
正确结构:
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>
文章来源:https://blog.csdn.net/qq_43733614/article/details/135157419
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!