场景:视频上传功能,上传列表使用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}"

WPF中DataGrid控件内Button的Command和CommandParameter的绑定的更多相关文章

  1. Working Experience - WPF 中 DataGrid 控件的应用

    问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...

  2. WPF中DataGrid控件的过滤(Filter)性能分析及优化

    DataGrid控件是一个列表控件, 可以进行过滤,排序等.本文主要针对DataGrid的过滤功能进行分析, 并提供优化方案. 1)DataGrid的过滤过程:      用户输入过滤条件       ...

  3. WPF中Datagrid控件添加行号

    /// <summary> /// 导入Excel文件按钮 /// </summary> /// <param name="sender">&l ...

  4. wpf 中DataGrid 控件的样式设置及使用

    本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </ ...

  5. WPF中利用控件的DataContext属性为多个TextBox绑定数据

    工作上需要从给定的接口获取数据,然后显示在界面的编辑框中,以往肯定会一个一个的去赋值,但这样太麻烦而且效率很低,不利于维护,于是想到了数据绑定这一方法,数据绑定主要利用INotifyPropertyC ...

  6. WPF的DataGrid控件从excel里复制数据然后粘贴

    WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...

  7. WPF中TreeView控件SelectedItemChanged方法的MVVM绑定

    问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...

  8. WPF中TreeView控件数据绑定和后台动态添加数据(二)

    写在前面:在(一)中,介绍了TreeView控件MVVM模式下数据绑定的方法.在这篇文章中,将总结给节点添加事件的方法,这样说有些不对,总之实现的效果就是点击某个节点,将出现对应于该节点的页面或者数据 ...

  9. WPF中查找控件的扩展类

    在wpf中查找控件要用到VisualTreeHelper类,但这个类并没有按照名字查找控件的方法,于是搜索网络,整理出下面这个类,感觉用起来很是方便. 贴出来,供大家参考. /// <summa ...

随机推荐

  1. webDriver API——第10部分Chrome WebDriver

    class selenium.webdriver.chrome.webdriver.WebDriver(executable_path='chromedriver', port=0, chrome_o ...

  2. 09-hibernate单表操作(1)

    1,单一主键 2,基本类型 3,对象类型 4,组件属性 5,单表操作 单一主键 常用生成策略: assigned 有程序员生成(手工) native 由数据库底层,如果是mysql是increment ...

  3. SchemaExport

    不在xml中配置         <!-- Drop and re-create the database schema on startup         <property name ...

  4. 用MyEclipse10.0远程连接Mysql数据库服务器

    说明:本文档所有的操作均在满足以下条件的情况下操作, A.远程Linux服务器已经安装好MySQL数据库 B.本地电脑可以ping通远程服务器 C.已经成功安装了Myeclipse 一.下载mysql ...

  5. Bootstrap手动打开隐藏模态框

    开发的时候遇到一个bug,关闭模态框后背景灰色图层依旧还在.原来是用错了隐藏模态框的代码. 正确的调用方式如下: $("#id").modal("show"); ...

  6. oracle聚合函数及行专列,pivot rollup cube

    1.原始数据 --方法-: --以单位分组,计算每类特殊情况的合计以及按照单位的小计数 with a as (SELECT b.szfz, case  when tsqk is not null th ...

  7. A Translation for Quaternion 一篇对四元数的翻译

    一篇写的非常好的博客:http://www.cnblogs.com/lookof/archive/2012/02/24/2360749.html

  8. Spark缓存机制

    虽然默认情况下 RDD 的内容是临时的,但 Spark 提供了在 RDD 中持久化数据的机制.第一次调用动作并计算出 RDD 内容后,RDD 的内容可以存储在集群的内存或磁盘上.这样下一次需要调用依赖 ...

  9. Objective-C之@protocol

    转自:http://www.cnblogs.com/hxxy2003/archive/2011/10/24/2222838.html @protocol是Objective-C中的接口定义方式,也就是 ...

  10. mysql 两列互转

    1.mysql 一张表两列互转 UPDATE tm_position as a,tm_position as b SET a.gps_longitude = b.gps_latitude,a.gps_ ...