2012-12-06 107 views
0

我有一個WPF程序可以產生多個DataGrid。我已經添加功能使用的思想在這個網站每個網格導出到Excel: http://www.codeproject.com/Articles/120480/Export-to-Excel-Functionality-in-WPF-DataGrid從XAML按鈕發送網格名稱和類名WPF

目前我只是有自己的處理程序的每個網格,看起來像這樣下一個按鈕:

private void m_btnExportTimePartitionToExcel_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      ExportToExcel<SystemTimeRecordData, List<SystemTimeRecordData>> s = new ExportToExcel<SystemTimeRecordData, List<SystemTimeRecordData>>(); 
      ICollectionView view = CollectionViewSource.GetDefaultView(m_gridPartitionSystemTimeRecords.ItemsSource); 
      s.dataToPrint = (List<SystemTimeRecordData>)view.SourceCollection; 
      s.GenerateReport(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Problem with exporting Excel. Error: " + ex.Message); 
     } 
    } 

我爲每個網格都有一個類似的按鈕處理程序。這一切都有效,但它「聞起來」。看起來應該有一種方法可以讓每個按鈕都調用一個處理程序。也就是說,如果我可以傳遞與該按鈕相關的網格和相關的類。我可以從XAML那裏做到嗎?我搜索並查看了傳遞參數的例子,但不是網格本身,當然也不是這個類,我猜它必須作爲類型傳遞? 這將是很好的東西,如更換上面的代碼...

private void m_btnExportTimePartitionToExcel_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
            // some how get Type type, and grid from sender and/or e 
      ExportToExcel<type, List<type>> s = new ExportToExcel<type, List<type>>(); 
      ICollectionView view = CollectionViewSource.GetDefaultView(m_grid.ItemsSource); 
      s.dataToPrint = (List<type>)view.SourceCollection; 
      s.GenerateReport(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Problem with exporting Excel. Error: " + ex.Message); 
     } 
    } 

然後我可以有一個按鈕處理!有任何想法嗎? 謝謝, 戴夫

+0

嘗試字典映射按鈕名稱到DataGrid。只需將發件人投到按鈕並訪問該名稱即可。 – Paparazzi

回答

0

這裏有幾個方法,你可以這樣做:

  • 你可以嘗試傳遞DataGrid作爲CommandParameter如果你能找到它使用ElementNameRelativeSource結合

    <Button CommandParameter="{Binding ElementName=DataGridA}" ... /> 
    
    <!-- Will only work if this is inside the DataGrid somewhere, like in the footer --> 
    <Button CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" ... /> 
    

    然後,您可以使用​​

  • 你可以通過ItemsSource作爲CommandParameter而不是整個數據網格的

    <StackPanel> 
        <DataGrid ItemsSource="{Binding SomeCollection}" ... /> 
        <Button CommandParameter="{Binding SomeCollection}" ... /> 
    </StackPanel> 
    
  • 你可以瀏覽的VisualTree找到最接近的數據網格。我有一些helpers on my blog,這使得這很容易。下面是使用他們與上面的XAML的例子:

    var parentPanel = VisualTreeHelpers.FindAncestor<StackPanel>((Button)sender); 
    var datagrid = VisualTreeHelpers.FindChild<DataGrid>(parentPanel); 
    

我敢肯定有其他的方法太,但這些是首先我想到的:)