文章速览
坚持记录实属不易,希望友善多金的码友能够随手点一个赞。
共同创建氛围更加良好的开发者社区!
谢谢~
引言
正确结构:
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>