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

热门文章

  1. Flutter常用布局组件
  2. okhttp-OkGo的文件下载模块
  3. LR中判断HTTP返回状态
  4. MediaWiki怎样重置用户password
  5. JDBC:数据库操作:处理大对象CLOB数据
  6. php json_decode失败,返回null
  7. C# 调用bat文件
  8. 最实用、最常用的jQuery代码片段
  9. sklearn基本回归方法
  10. idea lib下有jar包但是仍然报错 找不到类