WPF datagrid mvvm loaded 100M items,prism.wpf,prism.dryioc

news/2025/10/27 22:21:18/文章来源:https://www.cnblogs.com/Fred1987/p/19170316
Install-Package Prism.Wpf
Install-Package Prism.DryIOC
#region Interfaces
public interface IIDService
{int GetID();
}public class IDService : IIDService
{int idx = 0;public int GetID(){return Interlocked.Increment(ref idx);}
}public interface INameService
{string GetName();
}public class NameService : INameService
{int idx = 0;public string GetName(){return $"Name_{Interlocked.Increment(ref idx)}";}
}public interface IISBNService
{string GetISBN();
}public class ISBNService : IISBNService
{int idx = 0;public string GetISBN(){return $"ISBN_{Interlocked.Increment(ref idx)}";}
}#endregionusing System.Configuration;
using System.Data;
using System.Windows;namespace WpfApp39
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<IIDService, IDService>();containerRegistry.RegisterSingleton<INameService, NameService>();containerRegistry.RegisterSingleton<IISBNService,ISBNService>();containerRegistry.RegisterSingleton<MainWindow>();containerRegistry.RegisterSingleton<MainWindowViewModel>();}}}public async Task InitBooksCollectionAsync(){BooksCollection = new ObservableCollection<Book>();List<Book> booksList = new List<Book>();for (int i = 1; i < 100000001; i++){booksList.Add(new Book(){Id=idService.GetID(),Name=nameService.GetName(),ISBN=isbnService.GetISBN(),Title=$"Title_{i}",Topic=$"Topic_{i}"});if(i%1000000==0){await PopulateBooksCollectionAsync(booksList);}}}private async Task PopulateBooksCollectionAsync(List<Book> booksList){await Application.Current.Dispatcher.InvokeAsync(() =>{var tempList = booksList.ToList();booksList.Clear();foreach (var bk in tempList){BooksCollection.Add(bk);}MainTitle = $"Loaded {BooksCollection.Count} items,{GetMemory()}";}, System.Windows.Threading.DispatcherPriority.Background);}private string GetMemory(){var mem = Process.GetCurrentProcess().PrivateMemorySize64 / 1024.0d / 1024.0d;return $"Memory:{mem.ToString("N2")} M";}

 

 

//App
<prism:PrismApplication x:Class="WpfApp39.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp39"xmlns:prism="http://prismlibrary.com/">    
</prism:PrismApplication>
using System.Configuration;
using System.Data;
using System.Windows;namespace WpfApp39
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<IIDService, IDService>();containerRegistry.RegisterSingleton<INameService, NameService>();containerRegistry.RegisterSingleton<IISBNService,ISBNService>();containerRegistry.RegisterSingleton<MainWindow>();containerRegistry.RegisterSingleton<MainWindowViewModel>();}}}<Window x:Class="WpfApp39.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp39"xmlns:prism="http://prismlibrary.com/"mc:Ignorable="d"Title="{Binding MainTitle}" Height="450" Width="800"WindowState="Maximized"prism:ViewModelLocator.AutoWireViewModel="True"><Grid><DataGrid ItemsSource="{Binding BooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"VirtualizingPanel.CacheLength="2,2"VirtualizingPanel.CacheLengthUnit="Item"ScrollViewer.IsDeferredScrollingEnabled="True"ScrollViewer.CanContentScroll="True"AutoGenerateColumns="False"CanUserAddRows="False"><DataGrid.Columns><DataGridTemplateColumn><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid Width="{Binding DataContext.GridWidth,RelativeSource={RelativeSource AncestorType=Window}}"Height="{Binding DataContext.GridHeight,RelativeSource={RelativeSource AncestorType=Window}}"><Grid.Resources><Style TargetType="TextBlock"><Setter Property="FontSize" Value="30"/><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="VerticalAlignment" Value="Center"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="FontSize" Value="50"/><Setter Property="Foreground" Value="Red"/></Trigger></Style.Triggers></Style></Grid.Resources><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Id}"/><TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/><TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Title}"/><TextBlock Grid.Row="0" Grid.Column="3" Text="{Binding Topic}"/><TextBlock Grid.Row="1" Grid.Column="0"  Grid.ColumnSpan="4"Text="{Binding ISBN}"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid>
</Window>using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfApp39
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.Loaded += async (s, e) =>{var vm = this.DataContext as MainWindowViewModel;if(vm!=null){vm.GridWidth = this.ActualWidth;vm.GridHeight = this.ActualHeight / 2;await vm.InitBooksCollectionAsync();}};}}public class MainWindowViewModel : BindableBase{private IIDService idService;private INameService nameService;private IISBNService isbnService;public MainWindowViewModel(IIDService idServiceValue, INameService nameServiceValue,IISBNService isbnServiceValue){idService = idServiceValue;nameService = nameServiceValue;isbnService = isbnServiceValue;}public async Task InitBooksCollectionAsync(){BooksCollection = new ObservableCollection<Book>();List<Book> booksList = new List<Book>();for (int i = 1; i < 100000001; i++){booksList.Add(new Book(){Id=idService.GetID(),Name=nameService.GetName(),ISBN=isbnService.GetISBN(),Title=$"Title_{i}",Topic=$"Topic_{i}"});if(i%1000000==0){await PopulateBooksCollectionAsync(booksList);}}}private async Task PopulateBooksCollectionAsync(List<Book> booksList){await Application.Current.Dispatcher.InvokeAsync(() =>{var tempList = booksList.ToList();booksList.Clear();foreach (var bk in tempList){BooksCollection.Add(bk);}MainTitle = $"Loaded {BooksCollection.Count} items,{GetMemory()}";}, System.Windows.Threading.DispatcherPriority.Background);}private string GetMemory(){var mem = Process.GetCurrentProcess().PrivateMemorySize64 / 1024.0d / 1024.0d;return $"Memory:{mem.ToString("N2")} M";}private string mainTitle;public string MainTitle{get{return mainTitle; }set{SetProperty(ref  mainTitle, value);}}private double gridWidth;public double GridWidth{get{return gridWidth;}set{SetProperty(ref gridWidth, value);}}private double gridHeight;public double GridHeight{get{return gridHeight;}set{SetProperty(ref gridHeight, value);}}private ObservableCollection<Book> booksCollection;public ObservableCollection<Book> BooksCollection{get{return booksCollection;}set{SetProperty(ref booksCollection, value);}}}public class Book{public int Id { get; set; }public string Name { get; set; }public string ISBN { get; set; }public string Title { get; set; }public string Topic { get; set; }}#region Interfacespublic interface IIDService{int GetID();}public class IDService : IIDService{int idx = 0;public int GetID(){return Interlocked.Increment(ref idx);}}public interface INameService{string GetName();}public class NameService : INameService{int idx = 0;public string GetName(){return $"Name_{Interlocked.Increment(ref idx)}";}}public interface IISBNService{string GetISBN();}public class ISBNService : IISBNService{int idx = 0;public string GetISBN(){return $"ISBN_{Interlocked.Increment(ref idx)}";}}#endregion
}

 

 

 

image

 

 

 

 

image

 

 

 

image

 

 

 

image

 

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

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

相关文章

20232406 2025-2026-1 《网络与系统攻防技术》实验三实验报告

免杀原理与实践 一、实验内容问题回答: (1)杀软是如何检测出恶意代码的? 签名匹配:最传统的检测方式,杀软维护一个已知恶意软件的签名数据库。当扫描文件或系统时,杀软会将扫描对象与这些签名进行比对,如果发现…

20232424 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232424 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1.实验内容1.1尝试使用msfvenom中的编码器生成多种类型的后门文件 1.2利用工具对文件进行加壳操作 1.3使用C语言 + shellcode编程 1.4尝试利用免杀技术通过…

MLA原理讲解

多头潜在注意力机制 首先我们来回忆一下大模型生成时一个标准多头注意力机制,首先对于第一个token,它的特征向量为H,通过Query权重矩阵,Key权重矩阵和Value权重矩阵,分别得到这个token的Q向量、K向量和V向量。然后…

LLM什么时候才能输出固定格式

转载原文地址 基于概率统计建模,llm展示了非凡的潜力。但是同样由于token的概率性输出,成为llm落地的一个小绊脚石。这里讨论一下几种常见的让llm规范输出目标格式内容的方法,不清楚当前最新研究进展是否有突破。 万…

MCP和Function Calling的区别

原文转载地址 之前一直浅浅看了一眼mcp,觉得和function calling并没有本质区别,被吹的太火了,这两天回头又看了一眼,又有了新的感悟。 让llm回答今天的天气 这种问题明显llm无法回答,因为llm无法感知外部世界,可…

《程序员修炼之道》 阅读笔记三

翻开软件工程的书籍,“石头汤”与“煮青蛙”这两个看似无关的寓言,却像两把钥匙,打开了我对“变化”与“行动”的思考。它们一个教会我如何主动推动改变,一个提醒我警惕被动沉沦,在代码敲打的日夜里,悄悄重塑着我…

sg.绑定键盘事件

python import PySimpleGUI as sglayout = [[sg.Input(key="-INPUT-")]] window = sg.Window("示例", layout) window["-INPUT-"].bind("<Return>", "ENTER"…

FastAPI 架构指南:用这份模版打造可扩展又安全的系统(附实战经验)

原创 AI研究生 AI大模型观察站 2025-10-27 08:16 我在生产环境中将这套结构打磨用于支持 500+ 并发用户;它扩展轻松、维护不累、生产力全速输出。 如果你只想直接在项目中使用该模板的 FastAPI 结构,请查看这个 G…

CF708E Students Camp 题解

\(\text{CF708E Students Camp 题解}\) 其实各个部分都是比较套路的题目。 要求是形成一个类似于中间贯通形式的连通块,显然各个行之间的概率可以独立考虑,但相邻行之间会影响答案,考虑到每一行剩下的一定是一个区间…

20251027

正睿二十连测 B 时间:\(40min\)。 用个并查集之类的东西维护一下边即可。可惜因为 map 常数巨大 TLE 了 \(8pts\)。 变成 unordered_map 或者加快读都能轻松通过。 C 方向搞错了,瞄了眼题解 \(35min\) 就做出来了。给…

window[-TEXT-] 有哪些属性和方法?

在PySimpleGUI中,window[-TEXT-](或其他元素如window["-INPUT-"])作为元素对象,拥有丰富的属性和方法,可实现动态交互和界面控制。以下是核心属性和方法的分类说明: 一、核心属性key功能:元素的唯一标…

HT-083 CSP J/S题解

HT-083 CSP J/S题解 J组 传送门 T1 思路 官方做法是考虑从\(n-1\) 到\(n\)是可以\(O(1)\)转移的,只需判断当前数是不是\(0\)的个数和\(1\)的个数相等,然后\(10^6\)范围内的数据就都可以递推预处理出来,时间复杂度\(O(n…

壁纸收集

壁纸收集收集一些自己喜欢的动漫图片这张大头症,实在是太喜欢了

洛谷 P6965 [NEERC 2016] Binary Code /「雅礼集训 2017 Day4」编码 【经验值记录】(2-SAT 学习笔记)

其实是一篇薛定谔的题解(因为贺了inf篇题解) 玩了我一下午的题(感觉至少是一个上位紫🟣) 啊啊啊啊啊好恶心啊使我san值狂掉! 感觉自己做的话一周也写不出来 前置知识 2-SAT(拓扑排序,trajan求强连通分量),前后缀…

CentOS7安装Miniconda

CentOS7安装Miniconda1. 物料包https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda操作系统和芯片架构 文件MacOS Intel Chip Miniconda3-latest-MacOSX-x86_64.shMacOS Apple Silicon Miniconda3-latest-MacOS…

我在博客修文物

## P14322 「ALFR Round 11」E 空崎ヒナ 题解**Sorasaki Hina 赛高!** 题目描述:给出若干次询问,每次询问给出 $[l,r]$,求: $$\sum_{i = l}^{r} [b_i \equiv x\pmod {\displaystyle\max_{l\le j\le i}a_j}]$$很…

CSP-S模拟40

前言: 谢谢 养鸡大户 帮我调 \(T1\) 的代码。 谢谢 小青蛙 给我讲解 \(T2\) 。 T1:公约数神庙(gcd) 思路: 其实大体思路不是很难,但是特判的情况真的好多啊。能在赛时水水的大数据下想到所有特判情况的大佬真的存…

CF1608F MEX counting 题解

\(\text{CF1608F MEX counting 题解}\) 求方案数显然是考虑 dp。考虑每次填一个数时 MEX 的变化:显然不降,但增幅不确定。我们并没有办法通过状压等技巧维护各个数的取值,考虑在 MEX 变化的时候维护每次大于当前 ME…

[题解]P7914 [CSP-S 2021] 括号序列

P7914 [CSP-S 2021] 括号序列 学习了 题解 P7914 【[CSP-S 2021] 括号序列】 - enucai 后进行记录。感谢原作者~下文用 \(K\) 表示输入的 \(k\)。 考虑区间 DP。 定义 \(f_{i,j,k\in\{0,1,2,3,4,5\}}\) 为区间 \([i,j…