Можно сделать, но не используя магические строки (например, «круг»), как в вашем примере.
Во-первых, вы должны проектировать свои модели на основе существующих элементов каркаса, а не разрабатывать модель с идеей создания новых элементов пользовательского интерфейса или попытки создать код, который интерпретирует их .
В WPF уже есть эллипс (круг), прямоугольник (квадрат) и целый ряд других геометрических примитивов для использования. Вы захотите создать модели, которые содержат общедоступные привязываемые свойства, которые можно привязать к экземплярам этих элементов, чтобы контролировать их форму и местоположение.
Не вдаваясь в подробности (или тестирование), я бы сделал что-то вроде этого
public class GeometricElement : INotifyPropertyChanged
{
// these are simplified and don't show INPC code
public double Left {get;set;}
public double Top {get;set;}
public Brush Fill {get;set;}
// ...
}
// ...
public class Square : GeometricElement
{
public double Width {get;set;}
public double Height {get;set;}
}
// ...
// bound to the window
public class CadAppDataContext
{
public ObservableCollection<GeometricElement> Elements {get; private set;}
}
И в моем xaml это выглядело бы как
<ItemsControl ItemsSource="{Binding Source={StaticResource cadAppDataContext}}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate TargetType="{x:Type me:Square}">
<Rectangle
Canvas.Left="{Binding Left}"
Canvas.Top="{Binding Top}"
Width="{Binding Width}"
Height="{Binding Height}"
Fill="{Binding Fill}" />
</DataTemplate>
<!-- more DataTemplates for circle, triangle, etc etc -->
</ItemsControl.Resources>
</ItemsControl>
ItemsControl создаст элемент Canvas и для каждого GeometricElement в моей коллекции Elements добавит новый дочерний элемент пользовательского интерфейса на основе типа объекта в Elements.
Элементы управления элементами связаны с коллекциями и могут добавлять или удалять элементы в зависимости от того, что происходит в коллекции в вашем коде. Он определяет добавляемый элемент пользовательского интерфейса, ища DataTemplate , предназначенный для определенного типа. Это обычная и важная схема, и поэтому использование магических струн в конечном итоге навредит вам; маршрут волшебной строки не позволит вам использовать возможности уже встроенной в WPF платформы.
Теперь я не говорю, что это будет работать из коробки. Вы, вероятно, натолкнетесь на свойства, которые не будут связываться без какого-либо тяжелого подъема. Возможно, вам даже придется расширить геометрические примитивы, чтобы заставить их вести себя так, как вы хотите. Но это шаблон, используемый в приложениях WPF. Понимание схемы и ее использование помогут вам избежать многих часов стресса и неудач.