通过DataTemplate导出WPF DataGrid:MVVM [英] Exporting WPF DataGrid through DataTemplate: MVVM

查看:76
本文介绍了通过DataTemplate导出WPF DataGrid:MVVM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,



我为我的一个类(MultiRunSimObj)定义了一个DataTemplate。该对象还包含一个ObservableCollection(SimObjects)。我将DataTemplate中的DataGrid绑定到此集合。



我希望能够将此数据网格导出到excel文件(最好使用所有格式)。我不想导出隐藏的列。



我可以在DataTemplate上放一个导出按钮,但不知道在那之后去哪里。由于这是一个DataTemplate,我没有背后的代码(无论如何我想避免使用MVVM)。请指导。



这是我的DataTemplate(不显示所有列的代码,因为数量> 100)。







Hello all,

I have defined a DataTemplate for one of my classes (MultiRunSimObj). This object also contains an ObservableCollection (SimObjects). I bind a DataGrid in my DataTemplate to this collection.

I want to be able to export this datagrid to excel file (preferable with all the formatting). I do not want to export the hidden columns though.

I can put a button for export on the DataTemplate, but don't know where to go after that. Since this is a DataTemplate, I do not have the luxury of code behind (anyways I want to avoid that for MVVM). Please guide.

Here is my DataTemplate (not showing the code for all the columns as there are > 100 in number).



<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

	xmlns:my="clr-namespace:Simulators;assembly=Simulators"

	xmlns:mv="clr-namespace:WPFResources;assembly=WPFResources"

					>
	<ResourceDictionary.MergedDictionaries>
		<ResourceDictionary Source="..\..\BaseStyles.xaml"/>
		<ResourceDictionary Source="..\..\Styles\Brushes.xaml"/>
		<ResourceDictionary Source="..\..\Styles\Buttons.xaml"/>
		
		<ResourceDictionary>
 
<DataTemplate DataType=  "{x:Type my:MultiRunSimObj}"  >
			  
				 
				<Grid IsEnabled="{Binding SimPending, Converter={StaticResource NotConvert}}">
 
					<DockPanel LastChildFill="True" >
 
						<Expander Header="Description" FontSize="12" DockPanel.Dock="Bottom" IsExpanded="false">
							<TextBox Name="txtDescription"  Height="50" VerticalScrollBarVisibility="Visible" AcceptsReturn="True" Foreground="blue"

						 Text="{Binding Path=Description}"/>
						</Expander>
						<StackPanel>
	
							<Grid>
 
								<DataGrid x:Name="GV_Run" ClipboardCopyMode="IncludeHeader" FrozenColumnCount="1"

								 ItemsSource="{Binding Path=SimObjects}" AutoGenerateColumns="False" RowDetailsVisibilityMode="Collapsed"

								 CanUserReorderColumns="False" CanUserSortColumns="False"

					  GridLinesVisibility="All" VerticalGridLinesBrush="#FF89C696" HorizontalGridLinesBrush="#FF89C696"

					  FontSize="12" FontStyle="Normal" FontFamily="Courier New" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" 

								 >
 
									<DataGrid.Resources>
										<mv:BindingProxy x:Key="proxy" Data="{Binding SimObj}" />
 
<Style TargetType="{x:Type DataGridRowHeader}">
											<Setter Property="Template">
												<Setter.Value>
													<ControlTemplate TargetType="DataGridRowHeader">
														<Border Padding="2">
															<StackPanel Orientation="Horizontal">
 
																<Button Name="btnLaunchObj"  ToolTip="Settings" Height="16" Width="16"

												Style="{StaticResource SettingsButtonStyle}"

														Command="{Binding LaunchControlModule}" Margin="0,1,2,1">
 
																</Button>
																<Popup x:Name="popupCurrentObj" 

													StaysOpen="False"     

													PlacementTarget="{Binding ElementName=UCMain}"

													Placement="Center"

													PopupAnimation="Fade"

													IsOpen="{Binding ShowControlModule}"   

													>
 
																	<Border BorderBrush="Maroon" BorderThickness="2" removed="#FFEA9D" Padding="5">
																		<ContentControl Content="{Binding}"/>
																	</Border>
 
																</Popup>
															</StackPanel>
														</Border>
 
													</ControlTemplate>
 
												</Setter.Value>
											</Setter>
										</Style>
 
										<Style TargetType="DataGridRow">
											<Style.Triggers>
												<DataTrigger Binding="{Binding strRunState}" Value="0">
													<Setter Property="Background" Value="White" />
												</DataTrigger>
												<DataTrigger Binding="{Binding strRunState}" Value="1">
													<Setter Property="Background" Value="LightGreen" />
												</DataTrigger>
												<DataTrigger Binding="{Binding strRunState}" Value="2">
													<Setter Property="Background" Value="Red" />
												</DataTrigger>
										   
											</Style.Triggers>
										</Style>
 
									</DataGrid.Resources>
 
									<DataGrid.RowDetailsTemplate>
										<DataTemplate>
											<ContentControl Content="{Binding}"/>
										</DataTemplate>
									</DataGrid.RowDetailsTemplate>
 
									<DataGrid.Columns>
										
 
										<!--Inputs-->
 
										<!--Run ID-->
										<DataGridTextColumn Header="Run ID" Binding="{Binding Path=RunID, Mode=TwoWay}"/>
                                   
                                        
                        <!--INDOOR UNIT INPUTS-->
 
										<!--DBi-->
                                        <DataGridTextColumn  Visibility="{Binding  Data.ControlModule.BoundaryConditions.IU_BCs.selDBi,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}"  Header="DBi" Binding="{Binding Path=ControlModule.BoundaryConditions.IU_BCs.DBi, Mode=TwoWay}"/>
 
										<!--WBi-->
                                        <DataGridTextColumn Header="{Binding Data.ControlModule.BoundaryConditions.IU_BCs.GetMoistAirPropDisplay, Source={StaticResource proxy}}" Visibility="{Binding  Data.ControlModule.BoundaryConditions.IU_BCs.selAMoistPropValue,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}" Binding="{Binding Path=ControlModule.BoundaryConditions.IU_BCs.AMoistPropValue, Mode=TwoWay}"/>
 
										<!--IU Airflow-->
										<DataGridTextColumn Header="{Binding Data.ControlModule.BoundaryConditions.IU_BCs.GetAirflowDisplay,  Source={StaticResource proxy}}" Visibility="{Binding  Data.ControlModule.BoundaryConditions.IU_BCs.selAirflow,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}" Binding="{Binding Path=ControlModule.BoundaryConditions.IU_BCs.AirflowValue, Mode=TwoWay}"/>
 
                                        <!--Patm_Alt-->
                                        <DataGridTextColumn Header="{Binding Data.ControlModule.BoundaryConditions.IU_BCs.GetPatm_AltDisplay,  Source={StaticResource proxy}}" Visibility="{Binding  Data.ControlModule.BoundaryConditions.IU_BCs.selPatm_AltValue,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}" Binding="{Binding Path=ControlModule.BoundaryConditions.IU_BCs.Patm_AltValue, Mode=TwoWay}"/>
                                        
                                        <!-- ESP-->
                                        <DataGridTextColumn Visibility="{Binding  Data.ControlModule.BoundaryConditions.IU_BCs.selESP,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}"  Header="ESP" Binding="{Binding Path=ControlModule.BoundaryConditions.IU_BCs.ESP, Mode=TwoWay}"/>
 
 
                                        
                        <!--Coil1 Air Coil IU INPUTS-->
 
                                        <!--Coil1 DBi-->
                                        <DataGridTextColumn  Visibility="{Binding  Data.ControlModule.AirCoil1BC.selDBi,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}"  Header="Coil1 DBi" Binding="{Binding Path=ControlModule.AirCoil1BC.DBi, Mode=TwoWay}"/>
 
                                        <!--Coil1 WBi-->
                                        <DataGridTextColumn Header="{Binding Data.ControlModule.AirCoil1BC.GetMoistAirPropDisplay, Converter={StaticResource DisplayConverter}, ConverterParameter=Coil1 ;, Source={StaticResource proxy}}" Visibility="{Binding  Data.ControlModule.AirCoil1BC.selAMoistPropValue,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}" Binding="{Binding Path=ControlModule.AirCoil1BC.AMoistPropValue, Mode=TwoWay}"/>
 
                                        <!--Coil1 IU Airflow-->
                                        <DataGridTextColumn Header="{Binding Data.ControlModule.AirCoil1BC.GetAirflowDisplay,  Source={StaticResource proxy}}" Visibility="{Binding  Data.ControlModule.AirCoil1BC.selAirflow,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}" Binding="{Binding Path=ControlModule.AirCoil1BC.AirflowValue, Mode=TwoWay}"/>
 
                                        <!--Coil1 Patm_Alt-->
                                        <DataGridTextColumn Header="{Binding Data.ControlModule.AirCoil1BC.GetPatm_AltDisplay,  Source={StaticResource proxy}}" Visibility="{Binding  Data.ControlModule.AirCoil1BC.selPatm_AltValue,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}" Binding="{Binding Path=ControlModule.AirCoil1BC.Patm_AltValue, Mode=TwoWay}"/>
 
                                        <!--Coil1 ESP-->
                                        <DataGridTextColumn Visibility="{Binding  Data.ControlModule.AirCoil1BC.selESP,
						Converter={StaticResource BoolToVisConverter}, Source={StaticResource proxy}, FallbackValue=Collapsed}"  Header="Coil1 ESP" Binding="{Binding Path=ControlModule.AirCoil1BC.ESP, Mode=TwoWay}"/>
 


                                 </DataGrid.Columns>
									
								</DataGrid>
 
 
 
								
							</Grid>
					
 
						</StackPanel>
 
 
 
 
					</DockPanel>
				</Grid>
 
			</DataTemplate>
 
			
		</ResourceDictionary>
		
	</ResourceDictionary.MergedDictionaries>
	  
 
 
 
</ResourceDictionary>

推荐答案

Use the VisualTreeHelper and get all the data into an array.

msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper(v=vs.110).aspx
Use the VisualTreeHelper and get all the data into an array.
msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper(v=vs.110).aspx


How do you decide what is hidden?

Use the ObservableCollection itself, but do not consider exporting columns that are visible.
How do you decide what is hidden?
Use the ObservableCollection itself, but do not consider exporting columns that are visible.


这篇关于通过DataTemplate导出WPF DataGrid:MVVM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆