or
<telerik:RadGridView x:Name="LoanGrid" ItemsSource="{Binding Loans}" IsBusy="{Binding AreLoansBusy}" CanUserSelect="{Binding CanUserSelectLoans}" SelectedItem="{Binding SelectedLoan, Mode=TwoWay}" Margin="10,-6,10,10" GroupRenderMode="Flat" IsReadOnly="{Binding UserHasProjectRole, Converter={StaticResource NegationConverter}}" ColumnWidth="*" CanUserInsertRows="{Binding UserHasProjectRole}" SelectionMode="Single" NewRowPosition="Bottom" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" ShowGroupPanel="False" IsFilteringAllowed="False" ValidatesOnDataErrors="InEditMode" ActionOnLostFocus="CommitEdit" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"> <telerik:RadGridView.Columns> <telerik:GridViewComboBoxColumn Header="Loan Type" IsReadOnly="False" DataMemberBinding="{Binding LoanTypeId}" SelectedValueMemberPath="Id" DisplayMemberPath="Description" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.LoanTypes}" Width="Auto" /> <telerik:GridViewDataColumn UniqueName="ApplicationAmount" Header="Application Amount" DataMemberBinding="{Binding ApplicationAmount, StringFormat=c2}" TextAlignment="Right" Width="Auto" /> <telerik:GridViewDataColumn Header="Total Project Costs" DataMemberBinding="{Binding TotalProjectCosts, StringFormat=c2}" TextAlignment="Right" Width="Auto" /> <telerik:GridViewDataColumn Header="Eligible Project Costs" DataMemberBinding="{Binding EligibleProjectCosts, StringFormat=c2}" TextAlignment="Right" Width="Auto" /> <telerik:GridViewDataColumn Header="Interest Rate" DataMemberBinding="{Binding InterestRate, StringFormat='{}{0}%'}" TextAlignment="Right" Width="Auto" /> <telerik:GridViewDataColumn Header="Indenture" DataMemberBinding="{Binding Indenture}" Width="Auto" /> <telerik:GridViewDataColumn Header="EFC Bond Series" DataMemberBinding="{Binding EfcBondSeries}" Width="Auto" /> <telerik:GridViewDataColumn Header="Auditing" IsReadOnly="True" Width="Auto"> <telerik:GridViewDataColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding LastUpdatedBy}" /> <TextBlock Text="{Binding LastUpdatedDate, StringFormat=g}" Margin="5 0 0 0" /> </StackPanel> </DataTemplate> </telerik:GridViewDataColumn.CellTemplate> </telerik:GridViewDataColumn> </telerik:RadGridView.Columns> <i:Interaction.Triggers> <i:EventTrigger EventName="RowEditEnded"> <infrastructure:InvokeDelegateCommandAction Command="{Binding LoanRowEditEndedCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=InvokeParameter}" /> </i:EventTrigger> <i:EventTrigger EventName="Deleting"> <infrastructure:InvokeDelegateCommandAction Command="{Binding LoanRowDeletingCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=InvokeParameter}" /> </i:EventTrigger> <i:EventTrigger EventName="RowValidating"> <infrastructure:InvokeDelegateCommandAction Command="{Binding LoanRowValidatingCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=InvokeParameter}" /> </i:EventTrigger> </i:Interaction.Triggers></telerik:RadGridView>public QueryableDataServiceCollectionView<ProjectPhaseLoan> Loans { get; private set; }<Window x:Class="TelerikDocxManipulationTest.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" Title="MainWindow" Height="800" Width="1000"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <telerik:DocxDataProvider x:Name="DocxDataProvider" RichTextBox="{Binding ElementName=DataInput}" Docx="{Binding Data, Mode=TwoWay}"> </telerik:DocxDataProvider> <StackPanel Orientation="Horizontal"> <Button Grid.Column="1" Width="100" Margin="10,0,0,0" Click="Import"> <TextBlock> Import </TextBlock> </Button> <Button Grid.Column="1" Width="100" Margin="10,0,0,0" Click="Merge"> <TextBlock> Merge </TextBlock> </Button> <Button Grid.Column="1" Width="100" Margin="10,0,0,0" Click="Export"> <TextBlock> Export </TextBlock> </Button> </StackPanel> <telerik:RadRichTextBox x:Name="DataInput" Grid.Row="1" IsSpellCheckingEnabled="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Visible" LayoutMode="Paged"/> </Grid></Window>using Microsoft.Win32;using System;using System.Collections.Generic;using System.ComponentModel;using System.IO;using System.Linq;using System.Windows;using Telerik.Windows.Documents.Flow.FormatProviders.Docx;using Telerik.Windows.Documents.Flow.Model;using Telerik.Windows.Documents.Flow.Model.Collections;namespace TelerikDocxManipulationTest{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window, INotifyPropertyChanged { public MainWindow() { InitializeComponent(); DataContext = this; } /// <summary> /// Telerik DocxFormatProvider /// </summary> private DocxFormatProvider provider = new DocxFormatProvider(); /// <summary> /// The binary data for the docx file /// </summary> private IList<byte> mData = new List<byte>(); public IList<byte> Data { get { return mData; } set { mData = value; OnPropertyChanged("Data"); } } /// <summary> /// Import a docx file from disk /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Import(object sender, RoutedEventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "docx files (*.docx)|*.docx"; dialog.RestoreDirectory = true; if (dialog.ShowDialog() == true) { try { Data = File.ReadAllBytes(dialog.FileName).ToList(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } /// <summary> /// Merge the current document with a docx document from disk /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Merge(object sender, RoutedEventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "docx files (*.docx)|*.docx"; dialog.RestoreDirectory = true; if (dialog.ShowDialog() == true) { try { RadFlowDocument existingDocument = provider.Import(Data.ToArray()); RadFlowDocument mergeDocument = provider.Import(dialog.OpenFile()); existingDocument.Merge(mergeDocument); Data = provider.Export(existingDocument).ToList(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } /// <summary> /// Export the current file data to disk /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Export(object sender, RoutedEventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); dialog.DefaultExt = "docx"; dialog.Filter = "docx files (*.docx)|*.docx"; dialog.RestoreDirectory = true; if (dialog.ShowDialog() == true) { using (Stream output = dialog.OpenFile()) { try { output.Write(Data.ToArray(), 0, Data.Count); MessageBox.Show("Document exported."); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } #region INotifiedProperty Block public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } #endregion }}
