在MVVM中使用WPF Infragistics Excel导出功能

在MVVM中使用WPF Infragistics Excel导出功能,wpf,mvvm,export-to-excel,infragistics,Wpf,Mvvm,Export To Excel,Infragistics,我正在使用Infragistics WPF datagrid,我想利用Infragistics提供的Excel导出功能。Excel导出的需要网格实例作为参数。这对MVVM不是很友好,因为我更喜欢处理命令来导出viewModel中的数据,而viewModel不知道视图中datagrid控件的实例 有人知道使用Infragistics库进行excel导出(最好基于网格绑定到的集合)的更为MVVM友好的机制吗?由于需要对网格进行引用,如您所知,您不应该将逻辑放入视图模型中。您只需要在代码隐藏中处理Ex

我正在使用Infragistics WPF datagrid,我想利用Infragistics提供的Excel导出功能。Excel导出的需要网格实例作为参数。这对MVVM不是很友好,因为我更喜欢处理命令来导出viewModel中的数据,而viewModel不知道视图中datagrid控件的实例


有人知道使用Infragistics库进行excel导出(最好基于网格绑定到的集合)的更为MVVM友好的机制吗?

由于需要对网格进行引用,如您所知,您不应该将逻辑放入视图模型中。您只需要在代码隐藏中处理Export命令。这样做并没有概念上的错误或反MVVM:这个特定的逻辑恰好是视图特定的。

数据网格是视图的一部分,导出到excel是这个网格的一个功能。ViewModel完全没有参与。这是一个纯粹的视图活动。考虑到这是一个纯视图功能,您不能/不需要在ViewModel中处理导出命令,而是在视图(代码隐藏)本身中处理。 明天,如果您用另一个datagrid替换此datagrid,则导出到excel功能也将消失,因为它由infragistics提供。因此,视图模型不应该做任何事情。但是,如果您想实现非基础设施专用的通用和独立功能,可以在ViewModel中实现(因为它是通用的,不依赖于基础设施)。

简单地说

您可以像这样在URXAML中添加按钮,并使用命令parmeter传递网格

<Button Content="Print" HorizontalAlignment="Left" Margin="201,35,0,0" Grid.Row="2"    VerticalAlignment="Top" Width="75" Height="29"
            Command="{Binding PrintCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=ParentC1DataGrid,Mode=OneWay}"
            />

在您的视图模型中添加以下命令:

private ICommand m_PrintCommand;
    public ICommand PrintCommand
    {

        get {

            if (this.m_PrintCommand == null)
            {
                this.m_PrintCommand = new DelegateCommand<C1.WPF.DataGrid.C1DataGrid>(PrintData);
            }
            return m_PrintCommand;
        }
    }

    private void PrintData(C1.WPF.DataGrid.C1DataGrid v)
    {
////put exporting code here
        PrintDialog printDlg = new PrintDialog();
        printDlg.PrintVisual(v, "Grid Printing.");

    }
private ICommand m_PrintCommand;
公共ICommand print命令
{
得到{
if(this.m_PrintCommand==null)
{
this.m_PrintCommand=新的DelegateCommand(PrintData);
}
返回m_print命令;
}
}
私有void打印数据(C1.WPF.DataGrid.C1DataGrid v)
{
////把导出代码放在这里
PrintDialog printDlg=新建PrintDialog();
printDlg.PrintVisual(v,“网格打印”);
}

此问题在以下基础设施论坛上重复: