wpf DATAgrid模板中button 命令綁定以及命令參數綁定


場景:視頻上傳功能,上傳列表使用DataGrid控件,視頻有不同的狀態對應不同的操作,DataGrid中最后一列為操作列,里面是Button控件。希望點擊Button后執行對應的操作,但是設置Button的 Command="{Binding VideoOperationCommand}"后觸發不了操作。

XAML代碼如下:

 

[html]  view plaincopy在CODE上查看代碼片派生到我的代碼片
  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,那這樣做就好了:

 

[html]  view plaincopy在CODE上查看代碼片派生到我的代碼片
  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的某一個屬性,比如視頻名稱:

 

 

[html]  view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. CommandParameter="{Binding Name}"  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM