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

文章速览

  • 引言
  • 错误示范
  • 示例1
  • 示例2

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

引言

正确结构:

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属性,实现INotifyPropertyChangedprivate 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端---表单标签

1. 表单的介绍 表单用于搜集不同类型的用户输入(用户输入的数据)&#xff0c;然后可以把用户数据提交到web服务器 。 2. 表单相关标签的使用 <form>标签 表示表单标签&#xff0c;定义整体的表单区域 <label>标签 表示表单元素的文字标注标签&#xff0c;定义文字…

lodash源码分析每日一练 - 数组 - fromPairs

今日分享&#xff1a; 每一步都是曼妙的风景~ _.fromPairs(pairs) 使用&#xff1a; 这个方法返回一个由键值对pairs构成的对象。 使用示例&#xff1a; _.fromPairs([[fred, 30], [barney, 40]]); // > { fred: 30, barney: 40 }尝试手写&#xff1a; ①返回新对象 ②…

Redis数据结构(常用5+4种特殊数据类型)

1、Redis 数据类型以及使用场景分别是什么&#xff1f; Redis 提供了丰富的数据类型&#xff0c;常见的有五种数据类型&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff…

119. 杨辉三角 II(Java)

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

通过自然语言处理增强推荐系统:协同方法

一、介绍 自然语言处理 (NLP) 是人工智能的一个分支&#xff0c;专注于使机器能够以有意义且有用的方式理解、解释和响应人类语言。它包含一系列技术&#xff0c;包括情感分析、语言翻译和聊天机器人。 另一方面&#xff0c;推荐系统&#xff08;RecSys&#xff09;是旨在向用户…

Android笔记(二十一):Room组件实现Android应用的持久化处理

一、Room组件概述 Room是Android JetPack架构组件之一&#xff0c;是一个持久处理的库。Room提供了在SQLite数据库上提供抽象层&#xff0c;使之实现数据访问。 &#xff08;1&#xff09;实体类&#xff08;Entity&#xff09;&#xff1a;映射并封装了数据库对应的数据表中…

LeetCode——1276. 不浪费原料的汉堡制作方案

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff0c;给你两个数tomatoSlices和cheeseSlices&#xff0c;然后每制作一个巨无霸汉堡则消耗4个tomatoSlices和1和cheeseSlices&#xff0c;每制作一个小皇堡则需要消耗2个tomatoSlices和1和cheeseSlices。问给你这两个…

彻底卸载Keil4

彻底卸载Keil4 双击 然后回到该软件的文件夹位置&#xff0c;把该文件夹删除即可&#xff0c;然后清一下回收站。

Leetcode 1349. 参加考试的最大学生数(Java + 按行状压暴力 + DP)

文章目录 题目思路Java 按行状压暴力 DP&#xff1a;第 1 步&#xff1a;第 2 步&#xff1a;第 3 步&#xff1a;第 4 步&#xff1a; 复杂度Code 题目 Problem: 1349. 参加考试的最大学生数给你一个 m * n 的矩阵 seats 表示教室中的座位分布。如果座位是坏的&#xff08;…

【Midjourney】Midjourney提示词格式详解

目录 &#x1f347;&#x1f347;Midjourney是什么&#xff1f; &#x1f349;&#x1f349;Midjourney怎么用&#xff1f; &#x1f514;&#x1f514;Midjourney提示词格式 &#x1f341; 1.模型版本提示词&#x1f341; 参数 参数详解 应用示例 &#x1f343; 2.风格…

基于双闭环PI的SMO无速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于双闭环PI的SMO无速度控制系统simulink建模与仿真&#xff0c;基于双闭环PI的SMO无速度控制系统主要由两个闭环组成&#xff1a;一个是电流环&#xff0c;另一个是速度环。…

AssertionError: The environment must specify an action space. 报错 引发的惨案

起因是&#xff1a;从github上下载了一个代码&#xff0c;运行出错。 整体流程&#xff1a; 1. AssertionError: The environment must specify an action space. 报错&#xff0c;解决方案是 降级gym到 gym0.18.0 2.为了降级gym gym0.18.0 报错&#xff0c;发现需要降级 setup…

Linux scp命令教程:如何安全地在Linux机器之间复制文件(附案例详解和注意事项)

Linux scp命令介绍 scp命令是Secure Copy的缩写&#xff0c;它是一个基于SSH的命令行工具&#xff0c;用于在两个位置之间安全地复制文件和目录。使用scp&#xff0c;你可以从本地系统复制文件或目录到远程系统&#xff0c;从远程系统复制文件或目录到本地系统&#xff0c;或者…

k8s实战之ELK日志管理

首先查看总体流程 首先创建namespace apiVersion: v1 kind: Namespace metadata:name: kube-logging 一、首先创建es.yaml --- apiVersion: v1 #kubernetes API版本,采用最新版本v1 kind: Service #资源类型定义为Service metadata: name: elasticsearch-logging # …

vue3 全局配置Axios实例

目录 前言 配置Axios实例 页面使用 总结 前言 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境。它提供了一种简单、一致的 API 来处理HTTP请求&#xff0c;支持请求和响应的拦截、转换、取消请求等功能。关于它的作用&#xff1a; 发起 HTTP …

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…

CSS Grid 网格布局简要说明

grid网格布局&#xff0c;是一个二维系统&#xff0c;可以像表格一样将页面容器分割成一块一块的区域&#xff0c;定义子元素的排布和位置。 简单使用&#xff1a; 对父元素设置dispay&#xff1a;grid;grid-template-colums和grid-template-rows来设置几行几列 1. grid-temp…

CMakeLists.txt

源码结构 生成可执行程序 # CMake最小版本号 cmake_minimum_required(VERSION 3.15.0)#增加-stdc11 set(CMAKE_CXX_STANDARD 11)#设置工程名称 project(calculate)#[[ #方法一&#xff1a;添加源码文件 #aux_source_directory(< dir > < variable >) #dir&#xf…

c# 比较对象是否相同

在C#中&#xff0c;比较两个对象是否相同可以有以下几种方法&#xff1a; ReferenceEquals(object o1, object o2)&#xff1a; 这是一个静态方法&#xff0c;用于比较两个对象的引用是否指向堆中的同一块内存。如果两个对象是同一个实例或者都是 null&#xff0c;那么返回 tru…

python异常之assert语句

1 python异常之assert语句 python的assert语句&#xff0c;是一个断言语句。 用于断言某个表达式的值是否符合预期&#xff0c;不符合则停止运行&#xff0c;并且触发AssertionError异常。 1.1 基本用法 用法 assert test_cond [,err_msg]描述 test_cond&#xff1a;要测…