Hi,
I'm looking to use the RadGridView with a specfic use case for filtering. We're in an MVVM setup, where filtering of the data rows is performed in the viewmodel rather than in the view. However, I'd still like to use a filter row in this setup.
Effectively, I want that filter row to be able to bind to our own FilterViewModel property in the view model that represents it. Imagine this as just a TextBox for each column sitting in the filter row on top that is represented by a Dictionary<string,string> in the viewmodel: where the key is the column unique name, and the value is what the user entered for that textbox. Behind the scenes, when this dictionary changes, we will perform the filtering ourselves.
As far as I understand it, this would require a custom filter control in the filter row of the RadGridView, and notification when the user changes a value in one of those filters. However, it seems like it's impossible to use the filtering row or indicators of the RadGridView without using IFilterDescriptors or other Telerik-specific filtering items. Is that true? How could I make this scenario work?
I'm able to do this to a certain extent with Infragistics controls -- we're evaluating Telerik to move over to and this is fairly critical to that process.
Thanks,
Alan
I want to change the width of the label part of DataFormDataField. The correct place to edit should be the controls ControlTemplate:
<Grid.ColumnDefinitions> <ColumnDefinition Width="*"/><!-- Label --> <ColumnDefinition Width="2*"/><!-- Editor --> <ColumnDefinition Width="24"/><!-- ? Icon --></Grid.ColumnDefinitions>I want this to be something like:
<Grid.ColumnDefinitions> <ColumnDefinition Width="{Binding LabelWidth}" /><!-- LabelWidth = Attached property? --> <ColumnDefinition Width="2*"/> <ColumnDefinition Width="24"/></Grid.ColumnDefinitions>
The width should not be a fix value in the ControlTemplate. It should be variable so different DataForms can have different label widths. Is that possible?
Johannes
Hi all,
I am using the RadRichTextBox to display a docx file in ReadOnly mode.
By default, the RadRichTextBox shows a gray background behind the page. I would like to change this from gray to black, but I cannot figure out how. I would rather not include a theme from telerik in my assembly as this is the only visual change I need to make.
Just to be clear, I want to change the background behind the page, not the color of the page itself.
Thanks

After looking at the CRM demo I decided to implement a similar type of functionality where based on a bool state the grid would show either a few columns or all columns
<telerik:RadGridView helpers:GridViewColumnHelper.HideNonImportantColumns="{Binding IsInOverviewState}"
ItemsSource="{Binding Contacts}" ColumnWidth="*"
I am using Prism, everything works fine if I set a Minimum Height and Width of the main Shell and set the WindowState to normal. However, if I start the application maximized without these settings, when the grid is loaded, although it shows the right number of columns the width of the grid is incorrect (too big), if I slightly adjust the size of the window everything sorts itself out.
This is the grid definition
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
if you see the attached files you will see what I mean.
Thanks for any help in advance.
I have a GridView that has 3 columns. However, the host Grid needs to be just the width of the 1st column. I have bound the column's Width Property to my Model View as shown:
<telerik:GridViewDataColumn Header="Name" DataMemberBinding="{Binding Name}" Width="{Binding NameColumnWidth}" IsReadOnly="True" />However, the Cell should resize only based on the content size so it is defined as SizeToCells:
private GridViewLength _nameColumnWidth = new GridViewLength(0, GridViewLengthUnitType.SizeToCells);[Display( AutoGenerateField=false)][System.Xml.Serialization.XmlIgnore]public GridViewLength NameColumnWidth{ get { return _nameColumnWidth; } set { if (_nameColumnWidth != value) { _nameColumnWidth = value; notifyPropertyChanged("NameColumnWidth"); } }}How can I set the grid width to match the width of the name column's width? Is there a converter that takes the AutoSize value from the column and converts it to Pixels? Or, can I set the System.Windows.GridLength = NameColumnWidth? Can I do this another way if I don't use SizeToCells?
<telerik:RadDocking x:Name="radDocking" PanesSource="{Binding Panes}"> <telerik:RadDocking.Resources> <Style x:Key="RadPaneCustomStyle" TargetType="{x:Type telerik:RadPane}" BasedOn="{StaticResource RadPaneStyle}"> <Setter Property="Header" Value="{Binding Header}" /> <Setter Property="ToolTip" Value="{Binding ToolTip}" /> <Setter Property="IsHidden" Value="{Binding IsHidden, Mode=TwoWay}" /> <Setter Property="IsActive" Value="{Binding IsActive, Mode=TwoWay}" /> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> </Style> <Style TargetType="{x:Type telerik:RadPane}" BasedOn="{StaticResource RadPaneCustomStyle}"> <Setter Property="CanDockInDocumentHost" Value="True" /> </Style> <Style TargetType="{x:Type telerik:RadDocumentPane}" BasedOn="{StaticResource RadPaneCustomStyle}"> <Setter Property="CanDockInDocumentHost" Value="True" /> </Style> </telerik:RadDocking.Resources> <telerik:RadDocking.DockingPanesFactory> <docking:CustomDockingPanesFactory /> </telerik:RadDocking.DockingPanesFactory> <telerik:RadDocking.CurrentSaveLoadLayoutHelper> <docking:CustomSaveLoadLayoutHelper /> </telerik:RadDocking.CurrentSaveLoadLayoutHelper> <telerik:RadSplitContainer InitialPosition="DockedLeft"> <telerik:RadPaneGroup x:Name="leftGroup" telerik:RadDocking.SerializationTag="leftGroup" /> </telerik:RadSplitContainer> <telerik:RadSplitContainer InitialPosition="DockedRight"> <telerik:RadPaneGroup x:Name="rightGroup" telerik:RadDocking.SerializationTag="rightGroup" /> </telerik:RadSplitContainer> <telerik:RadSplitContainer InitialPosition="DockedBottom"> <telerik:RadPaneGroup x:Name="bottomGroup" telerik:RadDocking.SerializationTag="bottomGroup" /> </telerik:RadSplitContainer> </telerik:RadDocking>public void SaveLayout(){ var docking = DockingManager as RadDocking; using (var stream = File.Open(GetLayoutFilePath(State), FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { docking.SaveLayout(stream); }}public void LoadLayout(WorkspaceState state){ var docking = DockingManager as RadDocking; using (var stream = File.Open(GetLayoutFilePath(State), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { docking.LoadLayout(stream); }}System.InvalidOperationException was unhandled HResult=-2146233079 Message=Cannot modify the logical children for this node at this time because a tree walk is in progress. Source=PresentationFramework StackTrace: at System.Windows.FrameworkElement.RemoveLogicalChild(Object child) at MS.Internal.Controls.InnerItemCollectionView.ClearModelParent(Object item) at MS.Internal.Controls.InnerItemCollectionView._RemoveAt(Int32 index, Int32 indexR, Object item) at MS.Internal.Controls.InnerItemCollectionView.Remove(Object item) at System.Windows.Controls.ItemCollection.Remove(Object removeItem) at Telerik.Windows.Controls.RadPaneGroup.CloseSinglePane(RadPane pane) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadPaneGroup.cs:line 1522 at Telerik.Windows.Controls.RadPaneGroup.ClosePane(RadPane pane) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadPaneGroup.cs:line 653 at Telerik.Windows.Controls.RadDocking.HidePane(RadPane pane) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadDocking.cs:line 430 at Telerik.Windows.Controls.RadPane.Close() in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadPane.cs:line 1461 at Telerik.Windows.Controls.RadPane.OnIsHiddenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadPane.cs:line 1226 at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) at System.Windows.StyleHelper.ApplyStyleOrTemplateValue(FrameworkObject fo, DependencyProperty dp) at System.Windows.StyleHelper.InvalidateContainerDependents(DependencyObject container, FrugalStructList`1& exclusionContainerDependents, FrugalStructList`1& oldContainerDependents, FrugalStructList`1& newContainerDependents) at System.Windows.StyleHelper.DoStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle) at System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle, Style& styleCache) at System.Windows.FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue) at System.Windows.FrameworkElement.UpdateStyleProperty() at System.Windows.TreeWalkHelper.InvalidateStyleAndReferences(DependencyObject d, ResourcesChangeInfo info, Boolean containsTypeOfKey) at System.Windows.TreeWalkHelper.OnResourcesChanged(DependencyObject d, ResourcesChangeInfo info, Boolean raiseResourceChangedEvent) at System.Windows.FrameworkElement.OnAncestorChangedInternal(TreeChangeInfo parentTreeState) at System.Windows.TreeWalkHelper.OnAncestorChanged(DependencyObject d, TreeChangeInfo info, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree) at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree) at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d, Boolean visitedViaVisualTree) at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode) at MS.Internal.PrePostDescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode) at System.Windows.TreeWalkHelper.InvalidateOnTreeChange(FrameworkElement fe, FrameworkContentElement fce, DependencyObject parent, Boolean isAddOperation) at System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent) at System.Windows.FrameworkElement.AddLogicalChild(Object child) at System.Windows.LogicalTreeHelper.AddLogicalChild(FrameworkElement parentFE, FrameworkContentElement parentFCE, Object child) at MS.Internal.Controls.InnerItemCollectionView.SetModelParent(Object item) at MS.Internal.Controls.InnerItemCollectionView.Add(Object item) at System.Windows.Controls.ItemCollection.Add(Object newItem) at Telerik.Windows.Controls.RadDocking.AddSplitContainer(RadSplitContainer radSplitContainer) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadDocking.cs:line 309 at Telerik.Windows.Controls.Docking.DockingLayoutFactory.LoadDocking(XmlReader reader) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\DockingLayoutFactory.cs:line 236 at Telerik.Windows.Controls.RadDocking.LoadLayout(Stream source, Boolean raiseEventsIfNoSerializationTag) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadDocking.Layout.cs:line 77 at Telerik.Windows.Controls.RadDocking.LoadLayout(Stream source) in c:\TB\105\WPF_Scrum\Release_WPF\Sources\Development\Controls\Docking\Docking\Docking\RadDocking.Layout.cs:line 58 at GameEd.IDE.Services.WorkspaceService.LoadLayout(WorkspaceState state) in d:\TFS\GameEd-Telerik\IDE\GameEd.IDE\Services\WorkspaceService.Layout.cs:line 107 at GameEd.IDE.Services.WorkspaceService.LoadLayout() in d:\TFS\GameEd-Telerik\IDE\GameEd.IDE\Services\WorkspaceService.Layout.cs:line 96 at Catel.MVVM.Command`2.Execute(TExecuteParameter parameter, Boolean ignoreCanExecuteCheck) at Catel.MVVM.Command`2.Execute(TExecuteParameter parameter) at Catel.MVVM.Command`2.Execute(Object parameter) at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) at System.Windows.Controls.MenuItem.InvokeClickAfterRender(Object arg) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation.Invoke() at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.Run() at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at System.Windows.Application.Run(Window window) at System.Windows.Application.Run() at GameEd.App.Main() in d:\TFS\GameEd-Telerik\GameEd\obj\Debug\obj\Debug\decoratedxaml\App.g.cs:line 0 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: I have stumbled upon an issue where I only want the user to be able to edit the lower half of a matrix (It is a matrix that is symmetrical across the diagonal). I am creating a datatable based on a 2d array.
the grid is defined like this:
<telerik:RadGridView x:Name="matrixView" ItemsSource="{Binding MatrixTable}" CanUserDeleteRows="False" CanUserInsertRows="False" CanUserReorderColumns="False" CanUserSortColumns="False" ShowGroupPanel="False" GridLinesVisibility="Both" SelectionUnit="Cell" Width="AUto" Height="Auto"></telerik:RadGridView>And then I have the following viewmodel:
public class MatrixViewModel { public DataTable MatrixTable { get; set; } public MatrixViewModel(double[,] matrix) { this.MatrixTable = BuildTable(matrix); } private DataTable BuildTable(double[,] matrix) { var table = new DataTable(); table.Columns.Add("Name", typeof(string)); for (int col = 0; col < matrix.GetLength(0); col++) { table.Columns.Add(col.ToString(), typeof(double)); } for (int i = 0; i < matrix.GetLength(0); i++) { var row = table.NewRow(); row[0] = i.ToString(); for (int j = 0; j <= i; j++) { row[j + 1] = matrix[i, j]; } table.Rows.Add(row); } return table; } }NullvalueToBoolean is defined as follows:
[ValueConversion(typeof(object), typeof(Boolean))] public class NullValueToBoolean : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value == null; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }And finally the codebehind:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = new MatrixViewModel(new double[,]{ {1,0,0}, {0.25,1,0}, {0.25,0.75,1} }); this.matrixView.AutoGeneratingColumn += matrixView_AutoGeneratingColumn; } void matrixView_AutoGeneratingColumn(object sender, GridViewAutoGeneratingColumnEventArgs e) { var column = (GridViewDataColumn)e.Column; column.IsFilterable = false; if (column.DataType == typeof(double?)) { column.IsReadOnlyBinding = new Binding(column.DataMemberBinding.Path.Path) { Converter = new NullValueToBoolean() }; } else { column.IsReadOnly = true; } } } The code produces the following output when I try to edit one of the cells that are not readonly:
System.Windows.Data Error: 40 : BindingExpression path error: '0' property not found on 'object' ''DataRow' (HashCode=9659819)'. BindingExpression:Path=0; DataItem='DataRow' (HashCode=9659819); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')
However, if I remove the code that sets the ReadOnlyBinding, editing works fine. Do you have a suggestion on how to fix/avoid this issue? Maybe there is a better way to solve this problem with the Telerik UI for WPF?
i m trying reload my diagram. Saving is going well but if i m try load data from xml string shapes are loaded correctly but there are no connections between shapes. I m using ObservableGraphSourceBase<GraphNode,Link> as graph source and it inherit ISerializableGraphSource interface. During the debug i ve found out that method DeserializeLink is never call. Could you be so kind and give some advice how to figure it out.
Thank you very much.
Best regards
Jakub
ps: here my serialization class
001.public partial class KnihyXmlGraphSource : ISerializableGraphSource002. {003. private List<GraphNode> SerializedNodes = new List<GraphNode>();004. public void SerializeNode(object model, SerializationInfo info)005. {006. GraphNode node = model as GraphNode;007. 008. string pom = node.ToString();009. info["Content"] = node.Content;010. info["ShapeType"] = node.ToString();011. info["Id"] = node.GetID();012. 013. }014. 015. public void SerializeLink(ILink link, SerializationInfo info)016. {017. var myLink = link as Link;018. if (myLink.Source != null)019. {020. info["Source"] = myLink.Source.GetID();021. }022. if (myLink.Target != null)023. {024. info["Target"] = myLink.Target.GetID();025. }026. if (myLink.Type != null)027. {028. info["Type"] = myLink.Type;029. }030. }031. 032. public ILink DeserializeLink(IConnection connection, SerializationInfo info)033. {034. Link link = new Link();035. string sourceID = string.Empty;036. string targetID = string.Empty;037. 038. 039. if (info["Target"] != null)040. {041. targetID = info["Target"].ToString();042. }043. if (info["Source"] != null)044. {045. sourceID = info["Source"].ToString();046. }047. if (info["Type"] != null)048. {049. switch (info["Type"].ToString())050. {051. case Constants.Type1:052. link.Type = LinkType.Typ1;053. break;054. case Constants.Type2:055. link.Type = LinkType.Typ2;056. break;057. default:058. link.Type = LinkType.Typ3;059. break;060. }061. }062. GraphNode source = SerializedNodes.FirstOrDefault(x => x.GetID().Equals(sourceID));063. if (source != null)064. {065. link.Source = source;066. }067. 068. GraphNode target = SerializedNodes.FirstOrDefault(x => x.GetID().Equals(targetID));069. if (target != null)070. {071. link.Target = target;072. }073. 074. if (info["Type"] != null)075. {076. string type = info["Source"].ToString();077. switch (type)078. {079. case Constants.Type1:080. link.Type = LinkType.Typ1;081. break;082. case Constants.Type2:083. link.Type = LinkType.Typ2;084. break;085. case Constants.Type3:086. link.Type = LinkType.Typ3;087. break;088. default:089. break;090. }091. }092. return link;093. }094. 095. public object DeserializeNode(IShape shape, SerializationInfo info)096. {097. GraphNode node = new GraphNode();098. 099. string pom = string.Empty;100. if (info["ShapeType"] != null)101. {102. pom = (info["ShapeType"].ToString());103. pom = pom.Substring(23);104. switch (pom)105. {106. case Constants.DescriptionNode:107. node = new DescriptionNode();108. node.shape = MindmapItem.ShapeTypes.Description;109. break;110. case Constants.AuthorNode:111. node = new AuthorNode();112. node.shape = MindmapItem.ShapeTypes.Author;113. break;114. case Constants.GenreNode:115. node = new GenreNode();116. node.shape = MindmapItem.ShapeTypes.Genre;117. break;118. case Constants.BookDescriptionNode:119. node = new BookDescriptionNode();120. node.shape = MindmapItem.ShapeTypes.BookDescription;121. break;122. default:123. break;124. }125. }126. 127. if (info["Position"] != null)128. {129. node.Position = Utils.ToPoint(info["Position"].ToString()).Value;130. }131. 132. if (info["Content"] != null)133. {134. node.Content = info["Content"].ToString();135. }136. 137. 138. SerializedNodes.Add(node);139. return node;140. }141. }