场景:视频上传功能,上传列表使用DataGrid控件,视频有不同的状态对应不同的操作,DataGrid中最后一列为操作列,里面是Button控件。希望点击Button后执行对应的操作,但是设置Button的 Command="{Binding VideoOperationCommand}"后触发不了操作。

XAML代码如下:

  1. <DataGrid ItemsSource="{Binding VideoList}">
  2. <DataGrid.Columns>
  3. <!--序号-->
  4. <DataGridTextColumn Header="序号" Width="80" Binding="{Binding Index}"/>
  5. <!--视频名称-->
  6. <DataGridTextColumn Header="视频名称" Width="300" Binding="{Binding Name}" />
  7. <!--文件大小-->
  8. <DataGridTextColumn Header="文件大小" Width="120" Binding="{Binding SizeString}" />
  9. <!--源视频地址-->
  10. <DataGridTextColumn Header="源视频地址" Width="280" Binding="{Binding SourcePath}" />
  11. <!--状态-->
  12. <DataGridTextColumn Header="状态" Width="120" Binding="{Binding StatusString}" />
  13. <!--上传进度-->
  14. <DataGridTemplateColumn Header="上传进度" Width="260">
  15. <DataGridTemplateColumn.CellTemplate>
  16. <DataTemplate>
  17. <ProgressBar Value="{Binding Progress}" Margin="20,0"/>
  18. </DataTemplate>
  19. </DataGridTemplateColumn.CellTemplate>
  20. </DataGridTemplateColumn>
  21. <!--上传速度-->
  22. <DataGridTextColumn Header="上传速度" Width="150" Binding="{Binding SpeedString}" />
  23. <!--操作-->
  24. <DataGridTemplateColumn Header="操作" MinWidth="120">
  25. <DataGridTemplateColumn.CellTemplate>
  26. <DataTemplate>
  27. <Button Content="{Binding OperationString}"
  28. Command="{Binding VideoOperationCommand}"
  29. CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedItem}" />
  30. </DataTemplate>
  31. </DataGridTemplateColumn.CellTemplate>
  32. </DataGridTemplateColumn>
  33. </DataGrid.Columns>
  34. </DataGrid>

分析:因为DataGrid的ItemsSource绑定了VideoList,VideoList是一个Video类的列表,DataGrid里面控件的DataContext就成了Video也就是里面控件的Binding都是Video的属性,比如视频名称(Binding="{Binding Name}")。而Video里没有VideoOperationCommand,所以就不能触发操作了。

解决:知道了原因就好说了,把Button的Command绑定为ViewModel里面的VideoOperationCommand就好了,而DataGrid的DataContext就是ViewModel,那这样做就好了:

  1. <!--操作-->
  2. <DataGridTemplateColumn Header="操作" MinWidth="120">
  3. <DataGridTemplateColumn.CellTemplate>
  4. <DataTemplate>
  5. <Button Content="{Binding OperationString}"
  6. Command="{Binding DataContext.VideoOperationCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"
  7. CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedItem}" />
  8. </DataTemplate>
  9. </DataGridTemplateColumn.CellTemplate>
  10. </DataGridTemplateColumn>

通过上面的分析,我们知道,可以直接为命令传递当前Video的某一个属性,比如视频名称:

  1. CommandParameter="{Binding Name}"

最新文章

  1. 父页面操作iframe子页面的安全漏洞及跨域限制问题
  2. git的使用以及github
  3. Android学习----自适应国际化语言
  4. java的transient
  5. VirtualBox启动虚拟机报错0x80004005
  6. QC、IQC、IPQC、FQC、OQC
  7. struts2拦截器-简单实现非法登录验证
  8. BUG Error:Execution failed for task &#39;:app:dexDebug&#39;.
  9. 【IE6的疯狂之九】li在IE中底部空行的BUG
  10. Java数据持久层框架 MyBatis之API学习七(动态 SQL详解)
  11. 《高效能程序员的修炼》读后感 By Yong Zhang
  12. scrapy爬虫学习系列四:portia的学习入门
  13. win10下安装vs2013无法安装解决方案
  14. MSF banner
  15. Nginx配置跨域请求 Access-Control-Allow-Origin *
  16. C#趋势图(highcharts插件)
  17. python的学习之路day6
  18. 【Android】Android版本和API Level对应关系
  19. collections模块---(namedtuple、deque、OrderdDict、defaultdict、Counter)和configparser模块
  20. KNOCKOUTJS DOCUMENTATION-绑定(BINDINGS)-自定义绑定

热门文章

  1. window下操作jenkins查看页面的几种方式
  2. python pip 升级 或者换源
  3. 图Lasso求逆协方差矩阵(Graphical Lasso for inverse covariance matrix)
  4. 17.Java基础_初探类的private和public关键字
  5. IEEE754 浮点数
  6. luoguP1972 [SDOI2009]HH的项链
  7. Django的下载与创建。
  8. Vue入门案例(二)
  9. LG4111/LOJ2122 「HEOI2015」小Z的房间 矩阵树定理
  10. 日常笔记6C++标准模板库(STL)用法介绍实例