首页 > 其他分享 >WPF ContextMenu MVVM Command CommandParameter Path=PlacementTarget

WPF ContextMenu MVVM Command CommandParameter Path=PlacementTarget

时间:2024-07-11 10:41:19浏览次数:13  
标签:PlacementTarget CommandParameter MVVM Windows dg System private using public

<DataGrid ItemsSource="{Binding BooksList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
          SelectionMode="Extended">
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Export" Command="{Binding ExportCmd}"
                      CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu},Path=PlacementTarget}"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>


//cs
private void ExportCmdExecuted(object obj)
{
    var dg = obj as DataGrid;
    if (dg != null)
    {
        string jsonStr = JsonConvert.SerializeObject(dg.Items, Formatting.Indented);
        System.IO.File.AppendAllText($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}Json.json", jsonStr);
        MessageBox.Show("Export Successfully!");
    }

}

 

 

Whole code 

//xaml
<Window x:Class="WpfApp204.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:WpfApp204"
        mc:Ignorable="d" WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid ItemsSource="{Binding BooksList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                  SelectionMode="Extended">
            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Export" Command="{Binding ExportCmd}"
                              CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu},Path=PlacementTarget}"/>
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>
    </Grid>
</Window>



//cs
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;
using Newtonsoft.Json;

namespace WpfApp204
{
    /// <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()
        {
            InitData();
        }

        private DelCmd exportCmd;
        public DelCmd ExportCmd
        {
            get
            {
                if(exportCmd == null) 
                {
                    exportCmd = new DelCmd(ExportCmdExecuted, ExportCmdCanExecute);
                }
                return exportCmd;
            }
        }

        private bool ExportCmdCanExecute(object obj)
        {
            return BooksList != null && BooksList.Any();
        }

        private void ExportCmdExecuted(object obj)
        {
            var dg = obj as DataGrid;
            if (dg != null)
            {
                string jsonStr = JsonConvert.SerializeObject(dg.Items, Formatting.Indented);
                System.IO.File.AppendAllText($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}Json.json", jsonStr);
                MessageBox.Show("Export Successfully!");
            }

        }

        private void InitData()
        {
            BooksList = new ObservableCollection<Book>();
            for(int i=0;i<10000000;i++)
            {
                BooksList.Add(new Book()
                {
                    Id = i + 1,
                    Name = $"Name_{i + 1}"
                });
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propName) 
        {
            var handler = PropertyChanged;
            if(handler!=null)
            {
                handler?.Invoke(this,new PropertyChangedEventArgs(propName));
            }
        }

        private ObservableCollection<Book> booksList;
        public ObservableCollection<Book> BooksList
        {
            get
            {
                return booksList;
            }
            set
            {
                if(booksList!=value)
                {
                    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;

        public bool CanExecute(object parameter)
        {
            if (canExecute == null)
            {
                return true;
            }
            return canExecute.Invoke(parameter);
        }

        public void Execute(object parameter)
        {
            execute(parameter);
        }
    }

    public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

 

Referenced https://blog.csdn.net/jumtre/article/details/19540371

标签:PlacementTarget,CommandParameter,MVVM,Windows,dg,System,private,using,public
From: https://www.cnblogs.com/Fred1987/p/18295562

相关文章

  • WPF MouseWheel MouseDown MouseUp MouseMove mapped in mvvm via behavior
    //xaml<Windowx:Class="WpfApp201.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • WPF Behavior InvokeCommandAction Command CommandParameter
    //xaml<behavior:Interaction.Triggers><behavior:EventTriggerEventName="MouseWheel"SourceObject="{BindingElementName=img}"><behavior:InvokeCommandActionCommand="{BindingMouseWheelCmd}"......
  • WPF MenuItem behavior MVVM
    //xaml<ImageGrid.Column="1"ClipToBounds="True"Source="{BindingSelectedItem.ImgUrl,ElementName=lbx}"><Image.ContextMenu><ContextMenu><MenuItemHeader="S......
  • WPF MVVM capture window keyboard
    //xaml<behavior:Interaction.Triggers><behavior:EventTriggerEventName="KeyDown"><behavior:CallMethodActionTargetObject="{Binding}"MethodName="Window_KeyDown"/></beha......
  • WPF Datagrid ContextMenu MenuItem Command CommandParameter MultiBinding
     //xaml<Windowx:Class="WpfApp194.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas......
  • WPF Image scalertransform translatetransform mvvm,custom delegate command Comman
    //xaml<Windowx:Class="WpfApp187.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • MVVM模式开发WinForm-ReactiveUI
    一、引言  谈到MVVM设计模式,首先让人想到的是WPF。没错,MVVM的概念是微软在2005年提出的,并首次将其应用到WPF中。最近非常火的Vue.js也是使用了MVVM的设计模式。MVVM设计模式的核心部分是DataBinding机制。顾名思义,其功能就是将Model的数据绑定到View层,并且将View层控件的变换绑......
  • 一款WPF的精简版MVVM框架——stylet框架(MVVM绑定、依赖注入等)
    今天偶然知道一款叫做stylet的MVVM框架,挺小巧的,特别是它的命令触发方式,简单粗暴,让人感觉很巴适,现在我做一个简单的demo来顺便来分享给大家。本地创建一个WPF项目,此处我使用.NET8来创建。然后引用stylet最新的nuget包。 然后删掉App.xaml里面自带的启动项删掉以后: sty......
  • 一款WPF的精简版MVVM框架——stylet框架的初体验(包括MVVM绑定、依赖注入等操作)
    今天偶然知道一款叫做stylet的MVVM框架,挺小巧的,特别是它的命令触发方式,简单粗暴,让人感觉很巴适,现在我做一个简单的demo来顺便来分享给大家。本地创建一个WPF项目,此处我使用.NET8来创建。然后引用stylet最新的nuget包。 然后删掉App.xaml里面自带的启动项删掉以后: styl......
  • 【Vue】深入理解MVVM模式的魔力
    目录前言一、MVVM模式是什么?二、具体示例总结前言    Vue.js是一种基于JavaScript的前端框架,它采用了MVVM(Model-View-ViewModel)模式来实现数据的双向绑定。在本篇博客中,我将介绍MVVM模式的基本概念,并演示如何使用Vue.js来实现这种模式。一、MVVM模式是什么? ......