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


    不同的状态对应不同的操作,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的某一个属性,比如视频名称:
     
  • 相关阅读:
    bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】
    bzoj 2055: 80人环游世界【有上下界有源汇最小费用最大流】
    bzoj 2406: 矩阵【二分+有源汇上下界可行流】
    bzoj 4873: [Shoi2017]寿司餐厅【最大权闭合子图】
    bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
    bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】
    bzoj 3996: [TJOI2015]线性代数【最小割】
    bzoj 3158: 千钧一发【最小割】
    bzoj 2597: [Wc2007]剪刀石头布【最小费用最大流】
    bzoj 5120: [2017国家集训队测试]无限之环【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/devgis/p/16523901.html
Copyright © 2020-2023  润新知