The exception throws when you use RadDiagram in a data binding scenario by populating its GraphSource and you want to draw a shape using the RadDiagramRibbon's ShapeTool.
InvalidOperationException: 'Cannot modify the Items collection when the GraphSource is set.'
To work this around, use the PreviewMouseDown, PreviewMouseMove and PreviewMouseUp events of RadDiagram in order to prevent the default logic executed by the ShapeTool. Then, in the event handlers, implement a custom logic that works with the diagram GraphSource.
private void RadDiagramRibbon_Loaded(object sender, RoutedEventArgs e)
{
var toolService = diagram.ServiceLocator.GetService<IToolService>() as ToolService;
this.shapeTool = (ShapeTool)toolService.ToolList.FirstOrDefault(x => x is ShapeTool);
}
private Point startPoint;
private bool isShapeCreationInProgress;
private MyNode currentShapeModel; // where MyNode derives from NodeViewModelBase and expose an additional Geometry property
private ShapeTool shapeTool;
private void RadDiagram_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (this.shapeTool.IsActive && !this.isShapeCreationInProgress)
{
this.isShapeCreationInProgress = true;
this.startPoint = this.diagram.GetTransformedPoint(e.GetPosition(this.diagram));
this.currentShapeModel = new MyNode()
{
Geometry = this.shapeTool.Geometry,
Position = this.startPoint,
Width = 0,
Height = 0
};
var source = (MyGraphSource)this.diagram.GraphSource;
source.AddNode(this.currentShapeModel);
e.Handled = true;
}
}
private void RadDiagram_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (this.shapeTool.IsActive && this.currentShapeModel != null && this.isShapeCreationInProgress)
{
var transformedPoint = this.diagram.GetTransformedPoint(e.GetPosition(this.diagram));
var width = Math.Abs(this.startPoint.X - transformedPoint.X);
var height = Math.Abs(this.startPoint.Y - transformedPoint.Y);
var x = Math.Min(this.startPoint.X, transformedPoint.X);
var y = Math.Min(this.startPoint.Y, transformedPoint.Y);
this.currentShapeModel.Width = width;
this.currentShapeModel.Height = height;
this.currentShapeModel.Position = new Point(x, y);
e.Handled = true;
}
}
private void RadDiagram_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
this.isShapeCreationInProgress = false;
e.Handled = true;
}