Prevent link creation on override void AddLink(MyLink link)

5 posts, 0 answers
  1. Sammy
    Sammy avatar
    15 posts
    Member since:
    Aug 2008

    Posted 08 Aug 2014 Link to this post

    Hi,

    I am overriding the Addlink method of my custom graphsource object that is derived the ObservableGraphSourceBase<NodeViewModelBase, MyLink>. I want to control the creation of the link  on certain conditions. If the conditions are met, I call the base.AddLink() method, otherwise I want to prevent the creation of link. How can I do this?

    I tried not calling base.AddLink() but the link still appears on the diagram while it is not contained in the graphsource. How can I prevent or delete this link to be shown on the diagram?

    Thanks,

    Semih
  2. Sammy
    Sammy avatar
    15 posts
    Member since:
    Aug 2008

    Posted 11 Aug 2014 Link to this post

    Any solution?
  3. UI for WPF is Visual Studio 2017 Ready
  4. Martin
    Admin
    Martin avatar
    1099 posts

    Posted 12 Aug 2014 Link to this post

    Hi Sammy,

    I am not sure that I completely understand your requirement. Can you elaborate a little more on your scenario by telling me how you add the connection and where the link appears? Also if you could provide me with a sample project it would be helpful for better understanding your case and assist you further.

    However, you can use the ConnectionManipulationCompleted event of the diagram to prevent creation (and any other manipulation) of a connection. Here is an example in code:

    private void diagram_ConnectionManipulationCompleted(object sender, ManipulationRoutedEventArgs e)
    {
        if( your condition is met )
        {
            // cancel the connection's manipulation
            e.Handled = true;
        }
    }  

    I hope this helps.

    Regards,
    Martin
    Telerik
     
    Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
     
  5. Sammy
    Sammy avatar
    15 posts
    Member since:
    Aug 2008

    Posted 13 Aug 2014 in reply to Martin Link to this post

    Hi Martin,

    Firstly, I use MVVM pattern for the project. What I want to do is, when the user grabs a connection from a connector and attaches it to a connector of another shape, I want to cancel the connection creation if the user tries to connect the connection to a connector of a shape that I don't want. To provide this I tried overriding the AddLink method. In the method I can detect the condition but, how can I remove or delete the connection that is created with the last move? I tried to change the visibility but since it is not added by calling the base.Addlink() method I cannot manipulate it at all. But the arrow remains on the diagram somehow.(non selectable, just visually there).

    How can I remove/hide the link shape that I don't want to be added.

    public override void AddLink(TransitionShapeViewModel link)
            {
                if (link.Source.IsArtificial)
                {
                    link.Visibility = Visibility.Collapsed;
                    link.Refresh();
                    return;
                }
     
                if (!link.IsConstraint)
                {
                    if (link.SourceConnectorPosition == "MiddleCenter" || link.TargetConnectorPosition == "MiddleCenter")
                    {
                        link.Visibility = Visibility.Collapsed;
                        link.Refresh();
                        return;
                    }
     
                    link.Transition.TargetState = link.Target.State;
                    link.Transition.SourceState = link.Source.State;
     
                    if (!link.Target.ParentComponent.Component.Transitions.Contains(link.Transition))
                    {
                        link.Target.ParentComponent.Component.Transitions.Add(link.Transition);
                    }
     
                    if (!link.Target.ParentComponent.TransitionShapeViewModels.Contains(link))
                    {
                        link.Target.ParentComponent.TransitionShapeViewModels.Add(link);
                    }
                }
     
                base.AddLink(link);
            }
  6. Martin
    Admin
    Martin avatar
    1099 posts

    Posted 15 Aug 2014 Link to this post

    Hello Sammy,

    The AddLink method will be called only if you add new connection in the diagram (therefore in the GraphSource). However, if you add connection and you doesn't call the base.AddLink() method, this new connection will be included in the diagram, but won't be synchronized with the view model which will lead to incorrect behavior of the link.

    In order to achieve your requirement you can use the ConnectionManipulationCompleted event that I mentioned in my last reply and implement your logic there. 

    private void diagram_ConnectionManipulationCompleted(object sender, ManipulationRoutedEventArgs e)
    {
        if (e.ManipulationStatus == ManipulationStatus.Attaching)
        {
            var targetShape = e.Shape as RadDiagramShapeBase;
            var connection = e.Connection as RadDiagramConnection;
            var node = targetShape.DataContext as Node;
            var link = connection.DataContext as TransitionShapeViewModel ;
     
             
            if ( your conditions are met) // the connection won't be added/moved
            {
                e.Handled = true;
            }
        }
    }

    As for removing a connection (link) from the diagram you can use the GraphSource's Links collection. The last connection in the collection is the last connection added in the diagram.

    Regards,
    Martin
    Telerik
     
    Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
     
Back to Top
UI for WPF is Visual Studio 2017 Ready