Load Save Diagram don t call DeserializeLink

11 posts, 0 answers
  1. Jakub
    Jakub avatar
    26 posts
    Member since:
    Apr 2015

    Posted 20 May 2015 Link to this post

     Hallo,



    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 : ISerializableGraphSource
    002.    {
    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.    }

  2. Peshito
    Admin
    Peshito avatar
    497 posts

    Posted 21 May 2015 Link to this post

    Hi Jakub,

    Thank you for providing a sample code. It does not become clear however what might be causing the issue of the method not being called. I also tried to reproduce it using our SDK example and all the connections loaded correctly. I overrode the DeserializeLink method and it was called just fine.

    Could you please take a look at the MVVM SDK sample as it might shed some light on the issue or attach a sample runnable copy of your project reproducing this behavior. As this is a forum thread you will need to use a third party web site for files sharing.

    Attached is an archive containing the MVVM SDK sample and the exported diagram(Diagram.xml).

    Regards,
    Peshito
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  3. UI for WPF is Visual Studio 2017 Ready
  4. Jakub
    Jakub avatar
    26 posts
    Member since:
    Apr 2015

    Posted 03 Jun 2015 in reply to Peshito Link to this post

    Here is a sample diagram with my problem.

    Thank you for your approach :)

     Jakub

     

    https://dl.dropboxusercontent.com/u/60389203/MindMapSample.zip

  5. Peshito
    Admin
    Peshito avatar
    497 posts

    Posted 08 Jun 2015 Link to this post

    Hi Jakub,

    Thank you for providing the running project. It helped in finding the reason for the issue you have experienced.

    I am now attaching a modified version of the sample where the saving and loading are both working well. Simply what was wrong is that you implemented ObservableGraphSourceBase and we recommend using an approach with implementing SerializableGraphSourceBase. More on this matter can be found here.

    Hope this helps.

    Regards,
    Peshito
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  6. Jakub
    Jakub avatar
    26 posts
    Member since:
    Apr 2015

    Posted 09 Jun 2015 in reply to Peshito Link to this post

    Hi Peshito,

     

    thank you for your answer it helps me a lot. There s some troubles i have with my scenario. After deserialize my links and nodes there's no style used in my connections. When i explore connection,  everything i need is there ( target node, source node, connection type) but  no style is used and connections are not connected to target or source shape at all. Could you be so kind and give me some advice with this problem?

     

    Thank you so much

    greetings Jakub.

  7. Peshito
    Admin
    Peshito avatar
    497 posts

    Posted 10 Jun 2015 Link to this post

    Hi Jakub,

    From the information provided I assume you are using implicit styles. If so, your connections may not be visible due to the fact that the styles are not Based On. By doing this, they should appear.

    For instance:
    <Style x:Key="pascalEdgeStyle" TargetType="telerik:RadDiagramConnection" BasedOn="{StaticResource RadDiagramConnectionStyle}">
         <Setter Property="TargetCapType" Value="Arrow1" />
         <Setter Property="ContentTemplate">
             <Setter.Value>
                 <DataTemplate />
             </Setter.Value>
         </Setter>
     </Style>
    If this is not what you had in mind. Please elaborate a bit more on the issue. Do you have any predefined style you are using? Any information will be useful.

    Regards,
    Peshito
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  8. Jakub
    Jakub avatar
    26 posts
    Member since:
    Apr 2015

    Posted 10 Jun 2015 in reply to Peshito Link to this post

    Hallo Peshito,

    yes i have predefined some styles and i'm using style selector to select which style should be used. I took it out from the sample for the simplification. Styles are defined in xaml file and this file is used like resource in my solution. Hope these information help a bit.

     

    Regards.

    Jakub

  9. Jakub
    Jakub avatar
    26 posts
    Member since:
    Apr 2015

    Posted 10 Jun 2015 in reply to Peshito Link to this post

    and for additional information. I have my custom graphSource class inherited from SerializableGraphSourceBase class. And i ve ovveride Deserialize and Serialize methos for links and nodes. here is piece of code for serialization and deserialization of link

     

    public override Link DeserializeLink(IConnection connection, SerializationInfo info)
            {
                Link link = new Link();
                string targetId = string.Empty;
                string sourceId = string.Empty;
     
                string type = info["Type"].ToString();
                switch (type)
                {
                    case Constants.Type1:
                        link.Type = LinkType.Typ1;
                        break;
                    case Constants.Type2:
                        link.Type = LinkType.Typ2;
                        break;
                    case Constants.Type3:
                        link.Type = LinkType.Typ3;
                        break;
                    default:
                        break;
                }
     
                if (info["SourceID"] != null)
                {
                    sourceId = info["SourceID"].ToString();
                }
     
                if (info["TargetID"] != null)
                {
                    targetId = info["TargetID"].ToString();
                }
     
                var sourceModel = this.SerializedNodes.FirstOrDefault(x => x.HashID.Equals(sourceId));
                if (sourceModel != null)
                {
                    link.Source = sourceModel;
                }
     
                var targetModel = this.SerializedNodes.FirstOrDefault(x => x.HashID.Equals(targetId));
                if (targetModel != null)
                {
                    link.Target = targetModel;
                }
     
     
                return link;
            }
     
    public override void SerializeLink(Link link, SerializationInfo info)
            {
                this.ClearCache();
                base.SerializeLink(link, info);
     
     
                if (link != null)
                {
                    info["SourceID"] = link.Source.HashID;
                    info["TargetID"] = link.Target.HashID;
                    info["LinkType"] = link.Type.ToString();
                }
            }

  10. Peshito
    Admin
    Peshito avatar
    497 posts

    Posted 12 Jun 2015 Link to this post

    Hello Jakub,

    As this is a running app and it most likely differ from the last modified version attached, I would like to ask you to provide the running sample app reproducing the issue. I will then be able to take a closer look into your styles and investigate the reason for the unwanted behavior.

    Attached is a version of the sample app already used in the thread where the styles have been properly applied over the connections and they are visible.

    Regards,
    Peshito
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  11. Jakub
    Jakub avatar
    26 posts
    Member since:
    Apr 2015

    Posted 12 Jun 2015 in reply to Peshito Link to this post

    Hallo Peshito,

     thank you for your answer. I try explain my issue better. After loading of diagram shapes and connections are not connected. It looks OK but if you drag some shape away, connection stays on original place. Second issue i have in my scenario is that after loading is not applied style on my connections. It looks like there is default use first style but never used second style. I attached sample project. There is two connections and four shapes as you've seen before. Both connections have different styles. For styling i'm using styleselector and as source for diagram i'm using graphsource. 

     

    thank you for your time and advices. 

    Have a nice day

    Jakub 

    ps: here is my sample project: https://db.tt/CHo6qEiv

  12. Peshito
    Admin
    Peshito avatar
    497 posts

    Posted 17 Jun 2015 Link to this post

    Hi Jakub,

    Thank you for sharing the project and describing the issue in details. The reason why the styles are not being applied is because you should serialize and deserialize the links as well. For this purpose override the SerializeLink and DeserializeLink methods. As for the connections not being connected to the shapes after the diagram is reloaded, this happens due to the fact that the SerializationInfo uses an ID property by default and having set the mapping with info["ID"] overrides the default one. Simply edit the name to something else like info["IDNew"] for instance.

    Attached is an updated version of the project having the above approach applied.

    Hope this helps.

    Regards,
    Peshito
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Back to Top
UI for WPF is Visual Studio 2017 Ready