0

我有一个生成多个 DataGrid 的 WPF 程序。我添加了使用此站点上的想法将每个网格导出到 Excel 的功能:http: //www.codeproject.com/Articles/120480/Export-to-Excel-Functionality-in-WPF-DataGrid

目前我在每个网格下都有一个按钮,它有自己的处理程序,看起来像这样:

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);
        }
    }

然后我可以只有一个按钮处理程序!有任何想法吗?谢谢,戴夫

4

1 回答 1

0

您可以通过以下几种方式做到这一点:

  • 您可以尝试传递 ,DataGrid如果CommandParameter您可以使用ElementNameorRelativeSource绑定找到它

    <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}}" ... />
    

    然后你可以得到价值((Button)sender).CommandParameter as DataGrid

  • 您可以传递ItemsSourceaCommandParameter而不是整个 DataGrid

    <StackPanel>
        <DataGrid ItemsSource="{Binding SomeCollection}" ... />
        <Button CommandParameter="{Binding SomeCollection}" ... />
    </StackPanel>
    
  • 您可以导航 VisualTree 以找到最近的 DataGrid。我的博客上有一些帮手可以让这件事变得简单。这是将它们与上述 XAML 一起使用的示例:

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

我敢肯定还有其他方法,但这些是我想到的第一个方法:)

于 2012-12-06T20:57:19.893 回答