不同的狀態對應不同的操作,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解決,應用系統架構,技術難題攻克等相關技術服務。