wpf DATAgrid模板中button 命令绑定以及命令参数绑定
场景:视频上传功能,上传列表使用DataGrid控件,视频有不同的状态对应不同的操作,DataGrid中最后一列为操作列,里面是Button控件。希望点击Button后执行对应的操作,但是设置Button的 Command="{Binding VideoOperationCommand}"后触发不了操作。
XAML代码如下:
- <DataGrid ItemsSource="{Binding VideoList}">
- <DataGrid.Columns>
- <!--序号-->
- <DataGridTextColumn Header="序号" Width="80" Binding="{Binding Index}"/>
- <!--视频名称-->
- <DataGridTextColumn Header="视频名称" Width="300" Binding="{Binding Name}" />
- <!--文件大小-->
- <DataGridTextColumn Header="文件大小" Width="120" Binding="{Binding SizeString}" />
- <!--源视频地址-->
- <DataGridTextColumn Header="源视频地址" Width="280" Binding="{Binding SourcePath}" />
- <!--状态-->
- <DataGridTextColumn Header="状态" Width="120" Binding="{Binding StatusString}" />
- <!--上传进度-->
- <DataGridTemplateColumn Header="上传进度" Width="260">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <ProgressBar Value="{Binding Progress}" Margin="20,0"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- <!--上传速度-->
- <DataGridTextColumn Header="上传速度" Width="150" Binding="{Binding SpeedString}" />
- <!--操作-->
- <DataGridTemplateColumn Header="操作" MinWidth="120">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <Button Content="{Binding OperationString}"
- Command="{Binding VideoOperationCommand}"
- CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedItem}" />
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- </DataGrid.Columns>
- </DataGrid>
分析:因为DataGrid的ItemsSource绑定了VideoList,VideoList是一个Video类的列表,DataGrid里面控件的DataContext就成了Video也就是里面控件的Binding都是Video的属性,比如视频名称(Binding="{Binding Name}")。而Video里没有VideoOperationCommand,所以就不能触发操作了。
解决:知道了原因就好说了,把Button的Command绑定为ViewModel里面的VideoOperationCommand就好了,而DataGrid的DataContext就是ViewModel,那这样做就好了:
- <!--操作-->
- <DataGridTemplateColumn Header="操作" MinWidth="120">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <Button Content="{Binding OperationString}"
- Command="{Binding DataContext.VideoOperationCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"
- CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedItem}" />
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
通过上面的分析,我们知道,可以直接为命令传递当前Video的某一个属性,比如视频名称:
- CommandParameter="{Binding Name}"
wpf DATAgrid模板中button 命令绑定以及命令参数绑定的更多相关文章
- WPF ListBoxItem模板中添加CheckBox选中问题
原文:WPF ListBoxItem模板中添加CheckBox选中问题 是这样的,需要一个ListBox来展示照片,并添加一个选中的CheckBox.这就需要对ListBox的ItemTemplate ...
- WPF数据模板中绑定事件不触发问题
今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...
- SpringMVC由浅入深day01_12参数绑定(12.1参数绑定过程_12.2默认支持的类型_12.3简单类型)
12 参数绑定 处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上. 注解适配器对RequestMapping标记的方法进行适配,对方法中的 ...
- [WPF]解决模板中ContextMenu绑定CommandParameter的问题
直接上代码,首先是一个ContextMenu的模板: <ContextMenu x:Key="Menu" BorderThickness="0.3" Fo ...
- WPF DataGrid列设置为TextBox控件的相关绑定
在wpf的DataGrid控件中,某一列的数据模板为TextBox控件的话,绑定Text="{Binding TxtSn, UpdateSourceTrigger=PropertyChang ...
- WPF datagrid/gridcontrol 中选中多行,复制粘贴到excel或其他文本编辑器中
wpf中 data grid 开启自带的选中,然后复制,可以到excel中直接粘贴,在某些业务场景中很实用,方便.开启也很简单: SelectionMode="Row" 加上这个, ...
- WPF DataGrid 行选中相关
DataGrid选中行是有自带SelectionChanged的,可是当需要重复选中同一行时,该事件就不会触发了. 后来反复查资料找到了DataGrid上有个DataGridRow. DataGrid ...
- SpringMVC中的参数绑定
SpringMVC中的参数绑定 参数绑定的定义 所谓参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller.从客户端请求key/value数据(比如ge ...
- SpringMVC的参数绑定
一.@RequestMapping注解说明 通过@RequestMapping注解可以定义不同的处理器映射规则. URL路径映射 @RequestMapping(value="/item ...
随机推荐
- 剑指offer 16:反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题思路 单链表原地反转是面试手撕代码环节非常经典的一个问题.针对一般单链表,反转的时候需要操作的是当前节点及与之相邻的其他两个节点.因而需要定 ...
- Kotlin介绍(非原创)
文章大纲 一.Kotlin简介二.Kotlin相比Java优势三.Kotlin与Java混合使用四.参考文章 一.Kotlin简介 1. 什么是Kotlin 安卓和Java,前者是最受欢迎的移动开 ...
- Gradle task简单使用
还望支持个人博客站:http://www.enjoytoday.cn task是什么 task是gradle构建脚本的最小运行单元,我们通过在gradle脚本中创建task任务,以期完成某个特定的功能 ...
- MySQL 部署分布式架构 MyCAT (五)
分片(水平拆分) 4.全局表 业务使用场景: 如果你的业务中有些数据类似于数据字典,比如配置文件的配置, 常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大, 而且大部分的业务场景都会用到 ...
- 5-1可视化库Seabon-整体布局风格设置
In [1]: import seaborn as sns import numpy as np import matplotlib as mpl import matplotlib.pyplot a ...
- 【洛谷P2494】 [SDOI2011]保密(分数规划+最小割)
洛谷 题意: 题意好绕好绕...不想写了. 思路: 首先类似于分数规划做法,二分答案得到到每个点的最小危险度. 然后就是在一个二分图中,两边撤掉最少的点(相应代价为上面算出的危险度)及相应边,使得中间 ...
- oracle 分组拼接
方法一:listagg, 参考链接,从oracle11g后出现的新函数 如果拼接的字符串长度超过4000字节,会报ora-01489错误,ora-01489 字符串连接的结果过长 解决方案. SELE ...
- Ubuntu命令行打开新终端并执行脚本
gnome-terminal -x bash -c "bash test.sh;exec bash;"
- jquery ajax 重写
(function($){ //备份jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=function(opt){ //备份opt中er ...
- MySchool题目
题目: 1.查询所有学生记录,包含年级名称2.查询S1年级下的学生记录 一.项目目录 二.com.myschool.dao 2.1 BaseDao package com.myschool.dao; ...