Hello,
I'm using a RadDiagram in my application. The GraphSource is backed by a ViewModel.
I need to draw shapes on the diagram, and have them added to the GraphSource. How can I achieve that?
I created a small test project, below. It has a window and a View Model.
At present, when I draw a path, new MyBaseNode object is created, but none of its properties have a value.
01.<Window x:Class="MainWindow"03. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"04. xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"05. xmlns:primitives="clr-namespace:Telerik.Windows.Controls.Diagrams.Primitives;assembly=Telerik.Windows.Controls.Diagrams"06. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"07. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"08. xmlns:my="clr-namespace:MvvmShapes"09. mc:Ignorable="d"10. Title="MainWindow"11. d:DesignWidth="800"12. d:DesignHeight="300"13. Height="350"14. Width="525">15. <Window.DataContext>16. <my:MyViewModel />17. </Window.DataContext>18. <Grid>19. <telerik:RadDiagram GraphSource="{Binding Graph, Mode=OneTime}"20. ActiveTool="{Binding DiagramTool}">21. <telerik:RadDiagram.ShapeStyle>22. <Style TargetType="telerik:RadDiagramShape">23. <!-- ce style relie les propriétés du ViewModel aux propriétés des formes dans le diagramme -->24. <!-- position -->25. <Setter Property="Position"26. Value="{Binding Position, Mode=TwoWay}" />27. <!-- rotation -->28. <Setter Property="RotationAngle"29. Value="{Binding RotationAngle, Mode=TwoWay}" />30. <!-- width and height -->31. <Setter Property="Width"32. Value="{Binding Width, Mode=TwoWay}" />33. <Setter Property="Height"34. Value="{Binding Height, Mode=TwoWay}" />35. <Setter Property="Content"36. Value="{Binding Content, Mode=OneTime}" />37. <Setter Property="Template">38. <Setter.Value>39. <ControlTemplate>40. <TextBlock Text="{Binding Content}" />41. </ControlTemplate>42. </Setter.Value>43. </Setter>44. </Style>45. </telerik:RadDiagram.ShapeStyle>46. </telerik:RadDiagram>47. 48. <StackPanel HorizontalAlignment="Left">49. <Button Command="{Binding CommandPointer, Mode=OneTime}"50. Content="Pointer" />51. <Button Command="{Binding CommandLine, Mode=OneTime}"52. Content="Line" />53. </StackPanel>54. </Grid>55.</Window>
001.Imports Telerik.Windows.Diagrams002.Imports Telerik.Windows.Controls.Diagrams.Extensions.ViewModels003. 004. 005.Public Class MyViewModel006. Inherits Telerik.Windows.Controls.ViewModelBase007. 008. Public Property Graph As New MyGraphSource()009. 010. Private _diagram_tool As Telerik.Windows.Diagrams.Core.MouseTool011. Public Property DiagramTool As Telerik.Windows.Diagrams.Core.MouseTool012. Get013. Return _diagram_tool014. End Get015. Set(value As Telerik.Windows.Diagrams.Core.MouseTool)016. _diagram_tool = value017. OnPropertyChanged("DiagramTool")018. End Set019. End Property020. 021. Public ReadOnly Property CommandPointer As ICommand022. Get023. Return New CommandImpl(Sub() DiagramTool = Core.MouseTool.PointerTool)024. End Get025. End Property026. 027. Public ReadOnly Property CommandLine As ICommand028. Get029. Return New CommandImpl(Sub() DiagramTool = Core.MouseTool.PathTool)030. End Get031. End Property032.End Class033. 034.Public Class MyGraphSource035. Inherits ObservableGraphSourceBase(Of MyBaseNode, MyLink)036. 037. Public Sub New()038. Dim node1 As New MyBaseNode() With {.Content = "node 1", .Position = New Point(100, 100), .Width = 60, .Height = 30}039. Dim node2 As New MyBaseNode() With {.Content = "node 2", .Position = New Point(400, 100), .Width = 60, .Height = 30}040. Dim node3 As New MyBaseNode() With {.Content = "node 3", .Position = New Point(100, 200), .Width = 60, .Height = 30}041. Dim node4 As New MyBaseNode() With {.Content = "node 4", .Position = New Point(400, 400), .Width = 60, .Height = 30}042. 043. Dim link1 As New MyLink(node1, node4) With {.Content = "A"}044. Dim link2 As New MyLink(node1, node3) With {.Content = "B"}045. Dim link3 As New MyLink(node1, node2) With {.Content = "C"}046. Dim link4 As New MyLink(node2, node3) With {.Content = "D"}047. 048. AddNode(node1)049. AddNode(node2)050. AddNode(node3)051. AddNode(node4)052. 053. AddLink(link1)054. AddLink(link2)055. AddLink(link3)056. AddLink(link4)057. End Sub058. 059. 060. 061.End Class062. 063.Public Class CommandImpl064. Implements ICommand065. 066. Private _command_action As Action067. Public Sub New(p_action As Action)068. _command_action = p_action069. End Sub070. 071. Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute072. Return True073. End Function074. 075. Public Event CanExecuteChanged(sender As Object, e As EventArgs) Implements ICommand.CanExecuteChanged076. 077. Public Sub Execute(parameter As Object) Implements ICommand.Execute078. _command_action()079. End Sub080.End Class081. 082.Public Class MyBaseNode083. Inherits NodeViewModelBase084. 085. Public Overrides Function ToString() As String086. Return If(Content IsNot Nothing, Content.ToString, "")087. End Function088.End Class089. 090. 091.Public Class MyLink092. Inherits LinkViewModelBase(Of MyBaseNode)093. 094. Public Sub New()095. MyBase.New()096. End Sub097. 098. Public Sub New(source As MyBaseNode, target As MyBaseNode)099. MyBase.New(source, target)100. End Sub101. 102. Public Overrides Function ToString() As String103. Return If(Content IsNot Nothing, Content.ToString, "")104. End Function105.End Class