

























public sealed class DelCmd : ICommand { private readonly Action<object?>? execute; private readonly Predicate<object?>? canExecute; public DelCmd(Action<object?>? executeValue, Predicate<object?>? canExecuteValue = null) { execute = executeValue; canExecute = canExecuteValue; } public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) { return canExecute?.Invoke(parameter) ?? true; } public void Execute(object? parameter) { execute?.Invoke(parameter); } public void RaiseCanExecuteChanged() { var handler = CanExecuteChanged; handler?.Invoke(this, EventArgs.Empty); } } public sealed class DelCmd<T> : ICommand { private readonly Action<T?>? execute; private readonly Predicate<T?>? canExecute; public DelCmd(Action<T?>? executeValue, Predicate<T?>? canExecuteValue = null) { execute = executeValue ?? throw new ArgumentNullException(nameof(executeValue)); canExecute = canExecuteValue; } public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) { if (canExecute is null) { return true; } T? para = default; if (parameter is T tPara) { para = tPara; } return canExecute(para); } public void Execute(object? parameter) { T? para = default; if (parameter is T tPara) { para = tPara; } execute?.Invoke(para); } public void RaiseCanExecuteChanged() { var handler = CanExecuteChanged; handler?.Invoke(this, EventArgs.Empty); } }
<Window x:Class="WpfApp38.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:WpfApp38" mc:Ignorable="d" Title="{Binding MainTitle}" WindowState="Maximized"> <Window.DataContext> <local:MainVM/> </Window.DataContext> <Grid> <DataGrid ItemsSource="{Binding BooksCollection}" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" VirtualizingPanel.CacheLength="5,5" VirtualizingPanel.CacheLengthUnit="Item" UseLayoutRounding="True" SnapsToDevicePixels="True" AutoGenerateColumns="True" CanUserAddRows="False" EnableRowVirtualization="True" EnableColumnVirtualization="True" ScrollViewer.IsDeferredScrollingEnabled="True" ScrollViewer.CanContentScroll="True"> <DataGrid.Resources> <Style TargetType="DataGridRow"> <Setter Property="FontSize" Value="30"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontSize" Value="40"/> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </DataGrid.Resources> <DataGrid.ContextMenu> <ContextMenu> <MenuItem Header="Load Data" FontSize="30" Command="{Binding LoadCmd}"/> </ContextMenu> </DataGrid.ContextMenu> </DataGrid> </Grid> </Window> using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics.Eventing.Reader; using System.Drawing.Imaging.Effects; using System.Runtime.CompilerServices; using System.Security.RightsManagement; 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; using Debug = System.Diagnostics.Debug; namespace WpfApp38 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class MainVM : INotifyPropertyChanged { public DelCmd LoadCmd { get; set; } private static long id = 0; public MainVM() { LoadCmd = new DelCmd(LoadCmdExecuted); LoadCmd.RaiseCanExecuteChanged(); _= LoadDataLoopsAsync(); } private void LoadCmdExecuted(object? obj) { _ = LoadDataAsync(); } private async Task LoadDataLoopsAsync() { while (true) { try { await LoadDataAsync(); } catch (Exception ex) { Debug.WriteLine($"{DateTime.Now},{ex.Message}"); } await Task.Delay(20000); } } private async Task LoadDataAsync() { List<Book> bksList = new List<Book>(); for (int i = 0; i < 2000000; i++) { var a = GetIncrementId(); bksList.Add(new Book() { Id = a, Name = $"Name_{a}", ISBN = $"ISBN_{a}_{Guid.NewGuid():N}", Comment = $"Comment_{a}", Content = $"Content_{a}", Abstract = $"Abstract_{a}", Author = $"Author_{a}", Summary = $"Summary_{a}", Title = $"Title_{a}", Topic = $"Topic_{a}" }); } await Application.Current.Dispatcher.InvokeAsync(() => { BooksCollection = new ObservableCollection<Book>(bksList); bksList.Clear(); MainTitle = $"{DateTime.Now},loaded {BooksCollection.Count} items,first Id:{BooksCollection.FirstOrDefault()?.Id},last Id:{BooksCollection.LastOrDefault()?.Id}"; }, System.Windows.Threading.DispatcherPriority.Background); } private static long GetIncrementId() { return Interlocked.Increment(ref id); } private string mainTitle; public string MainTitle { get { return mainTitle; } set { if (value != mainTitle) { mainTitle = value; OnPropertyChanged(); } } } private ObservableCollection<Book> booksCollection; public ObservableCollection<Book> BooksCollection { get { return booksCollection; } set { if (value != booksCollection) { booksCollection = value; OnPropertyChanged(); } } } public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propName = "") { var handler = PropertyChanged; handler?.Invoke(this, new PropertyChangedEventArgs(propName)); } } public sealed class DelCmd : ICommand { private readonly Action<object?>? execute; private readonly Predicate<object?>? canExecute; public DelCmd(Action<object?>? executeValue, Predicate<object?>? canExecuteValue = null) { execute = executeValue; canExecute = canExecuteValue; } public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) { return canExecute?.Invoke(parameter) ?? true; } public void Execute(object? parameter) { execute?.Invoke(parameter); } public void RaiseCanExecuteChanged() { var handler = CanExecuteChanged; handler?.Invoke(this, EventArgs.Empty); } } public sealed class DelCmd<T> : ICommand { private readonly Action<T?>? execute; private readonly Predicate<T?>? canExecute; public DelCmd(Action<T?>? executeValue, Predicate<T?>? canExecuteValue = null) { execute = executeValue ?? throw new ArgumentNullException(nameof(executeValue)); canExecute = canExecuteValue; } public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) { if (canExecute is null) { return true; } T? para = default; if (parameter is T tPara) { para = tPara; } return canExecute(para); } public void Execute(object? parameter) { T? para = default; if (parameter is T tPara) { para = tPara; } execute?.Invoke(para); } public void RaiseCanExecuteChanged() { var handler = CanExecuteChanged; handler?.Invoke(this, EventArgs.Empty); } } public class Book { public long Id { get; set; } public string Name { get; set; } public string ISBN { get; set; } public string Comment { get; set; } public string Content { get; set; } public string Author { get; set; } public string Abstract { get; set; } public string Summary { get; set; } public string Title { get; set; } public string Topic { get; set; } } }




此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。