当前位置: 首页 > news >正文

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

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://icebutterfly214.com/news/478/

相关文章:

  • sg.绑定键盘事件
  • 壁纸收集
  • Windows11安装miniconda
  • 10.27 CSP-S模拟40 改题记录
  • 详细介绍:Redis多租户资源隔离方案:基于ACL的权限控制与管理
  • 20251027周一日记
  • 学校协同云盘怎么选?2025年10大热门教育网盘推荐与对比
  • GPU集群之间的交互
  • CF1267G Game Relics
  • 102302115方朴第一次作业
  • 解题报告-梦熊 CSP-S2025 模拟赛T2
  • 鄙“站”麻将和算24,刷新后会换
  • 20232422 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 20232404 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 「WC2014-紫荆花之恋」题解
  • 谢谢你周医生
  • 来源未知
  • Date 10.27
  • 10.27及动手动脑
  • go包装bing搜索
  • 鼾声识别芯片方案和睡眠产品的应用场景
  • 2025年工程管理软件公司综合推荐榜:助力建筑行业数字化升级
  • Excel高性能异步导出完整方案!
  • 2025年多功能综合杆厂家排名前十推荐
  • 2025年度在线网站客服系统综合排行榜正式发布
  • JDD Oxygen智能零售论坛 | 《大模型时代的广告营销变革与实践》
  • 2025年市面上新加坡留学品牌、行业内公司及口碑产品推荐排行
  • 11-文件上传
  • TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南 - 指南
  • Navicat 17 超详细保姆级下载安装教程:附激活工具使用步骤​