public class DelCmd : ICommand { private readonly Action<Object> execute; private readonly Predicate<Object> canExecute; public DelCmd(Action<object> executeValue,Predicate<object> canExecuteValue) { execute= executeValue; canExecute= canExecuteValue; } public DelCmd(Action<object> executeValue):this(executeValue,null) { } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public bool CanExecute(object parameter) { if(canExecute==null) { return true; } return canExecute(parameter); } public void Execute(object parameter) { execute(parameter); } }
//xaml <Window x:Class="WpfApp203.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:WpfApp203" mc:Ignorable="d" WindowState="Maximized" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition/> </Grid.RowDefinitions> <ToolBar Grid.Row="0"> <Button Content="Load" Command="{Binding LoadCmd}"/> <Button Content="Save" Command="{Binding SaveCmd}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid}}"/> <Button Content="Clear" Command="{Binding ClearCmd}" CommandParameter="{Binding ElementName=gd}"/> </ToolBar> <DataGrid Grid.Row="1" x:Name="gd" ItemsSource="{Binding BooksList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> </DataGrid> </Grid> </Window> //xaml.cs using Microsoft.Win32; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; 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 WpfApp203 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var vm = new BookVM(); this.DataContext = vm; } } public class BookVM : INotifyPropertyChanged { public BookVM() { InitCmds(); //InitData(); } private void InitData() { List<Book> bkList = new List<Book>(); for (int i = 0; i < 10000000; i++) { bkList.Add(new Book { Id = i + 1, Name = $"Name_{i + 1}" }); } BooksList = new ObservableCollection<Book>(bkList); } private void InitCmds() { LoadCmd = new DelCmd(LoadCmdExecuted, LoadCmdCanExecute); ClearCmd = new DelCmd(ClearCmdExecuted, ClearCmdCanExecute); } private bool LoadCmdCanExecute(object obj) { return BooksList == null || !BooksList.Any(); } private bool ClearCmdCanExecute(object obj) { return BooksList != null && BooksList.Any(); } private void ClearCmdExecuted(object obj) { BooksList = null; } private void LoadCmdExecuted(object obj) { InitData(); } private bool SaveCmdCanExecute(object obj) { return BooksList != null && BooksList.Any(); } private void SaveCmdExecuted(object obj) { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "Json Files|*.json|All Files|*.*"; if (dialog.ShowDialog() == true) { string fileName = dialog.FileName; if (string.IsNullOrWhiteSpace(fileName)) { fileName = $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.json"; } string jsonStr = JsonConvert.SerializeObject(BooksList, Formatting.Indented); System.IO.File.AppendAllText(fileName, jsonStr); } } private DelCmd saveCmd; public DelCmd SaveCmd { get { if(saveCmd == null) { saveCmd = new DelCmd(SaveCmdExecuted, SaveCmdCanExecute); } return saveCmd; } } public DelCmd LoadCmd { get; set; } public DelCmd ClearCmd { get; set; } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propName) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propName)); } } private ObservableCollection<Book> booksList; public ObservableCollection<Book> BooksList { get { return booksList; } set { booksList = value; OnPropertyChanged(nameof(BooksList)); } } } public class DelCmd : ICommand { private readonly Action<Object> execute; private readonly Predicate<Object> canExecute; public DelCmd(Action<object> executeValue,Predicate<object> canExecuteValue) { execute= executeValue; canExecute= canExecuteValue; } public DelCmd(Action<object> executeValue):this(executeValue,null) { } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public bool CanExecute(object parameter) { if(canExecute==null) { return true; } return canExecute(parameter); } public void Execute(object parameter) { execute(parameter); } } public class Book { public int Id { get; set; } public string Name { get; set; } } }
标签:ICommand,execute,via,System,private,BooksList,using,public,DelCmd From: https://www.cnblogs.com/Fred1987/p/18294938