WPF中DataGrid控件内Button的Command和CommandParameter的绑定
2014-03-14 14:45
344 查看
场景:视频上传功能,上传列表使用DataGrid控件,视频有不同的状态对应不同的操作,DataGrid中最后一列为操作列,里面是Button控件。希望点击Button后执行对应的操作,但是设置Button的 Command="{Binding VideoOperationCommand}"后触发不了操作。
XAML代码如下:
分析:因为DataGrid的ItemsSource绑定了VideoList,VideoList是一个Video类的列表,DataGrid里面控件的DataContext就成了Video也就是里面控件的Binding都是Video的属性,比如视频名称(Binding="{Binding Name}")。而Video里没有VideoOperationCommand,所以就不能触发操作了。
解决:知道了原因就好说了,把Button的Command绑定为ViewModel里面的VideoOperationCommand就好了,而DataGrid的DataContext就是ViewModel,那这样做就好了:
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}"
相关文章推荐
- 数据分页存储过程
- 高斯混合模型算法
- 在C#中调用C++的DLL碰到的指针内容变化问题
- 几种免费推广渠道
- 我为何对加拿大情有独钟
- APPLE推送通知服务教程 PART-3
- Apple推送通知服务教程 PART-1
- 掌握对象的程序结构
- mysql数据库常用命令和方法
- android 客户端与web服务器端通信
- 如何利用jenkins来做android自动化
- data guard 主库 检测脚本
- 关于爬虫及蜘蛛的几点见解
- js调用打印机
- Mac与Mac之中的共享方式
- PhoneGap + JQueryMobile + HTML5
- Django 部署
- MySQL:日期函数、时间函数总结(MySQL 5.X)
- MySQL---SUBSTRING,LEFT,RIGHT,REPLACE,CONCACT
- OpenSUSE13.1 视频播放器 解码问题