WPF中DataGrid控件内Button的Command和CommandParameter的绑定
2024-08-28 01:54:02
场景:视频上传功能,上传列表使用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}"
最新文章
- PHP是怎么运行的
- Socket通信代码(原理)
- 黑马程序员——【Java高新技术】——类加载器
- SQL中Group By 的使用
- Interleaving String leetcode java
- 纯Python包发布setup脚本编写示例
- Bmob—移动后端云服务平台
- 18、HTML
- linux 下串口的配置
- 01js高级_1
- NSIS:判断并安装.NET Framework 4 的例子
- ORACLE 中IN和EXISTS比较
- 使用axis2开发webservices并打包到tomcat
- Static语句块和初始语句块的使用---2015年10月恒生电子笔试试卷
- Servlet--超链接,表单提交,重定向,转发4种情况的路径
- webpack学习笔记——解决多次输出的问题&;自动编译之启用观察者模式,热重载
- MinGW GCC 7.3.0 2018年1月25日 出炉啦
- ECMAScript各版本简介及特性
- 【Java】【9】String Date Calendar之间的转换
- spring-数据库操作组件的实现