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

各グリッドに同様のボタン ハンドラーがあります。これはすべて機能しますが、「においがします」。各ボタンが呼び出すハンドラーを 1 つだけ持つ方法があるはずです。つまり、そのボタンに関連付けられたグリッドと関連するクラスを渡すことができればということです。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);
        }
    }

そうすれば、ボタン ハンドラを 1 つだけ持つことができます。何か案は?ありがとう、デイブ

4

1 に答える 1

0

これを行うには、いくつかの方法があります。

  • またはバインディングを使用して見つけることができる場合は、DataGridを として渡すことができますCommandParameterElementNameRelativeSource

    <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

  • DataGrid 全体ItemsSourceの代わりに を渡すことができますCommandParameter

    <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 に答える