您的位置:首页 > 其它

WPF中DataGrid控件内Button的Command和CommandParameter的绑定

2014-03-14 14:45 344 查看
场景:视频上传功能,上传列表使用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}"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: