不同的狀態對應不同的操作,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的某一個屬性,比如視頻名稱:

 

專業從事基於C#,WinForm ,WPF,Silverlight,WCF以及MS Sql Server 2000/2005/2008/2012 Oracle 9i/10g/11g數據庫系統的ERP,CRM,企業進銷存等各種數據庫管理系統開發。Asp.net,Asp.net mvc,Webservice,WCF, Webapi等服務程序開發。 基於Oracle MySQL MSSql postgresql各種數據庫的管理系統數據同步服務。以及基於MapXtreme, Arcgis Engine ,以及基於Arcgis for silverlight/Javascript的WebGIS等相關的GIS系統二次開發。基於Windows 10 Mobile的移動端開發方案。針對各種系統的二次開發維護,並提供相關開發的技術性支持,如程序BUG解決,應用系統架構,技術難題攻克等相關技術服務。