У меня есть пользовательский элемент управления, который подклассов ItemsControl
DesignerSheetView.cs:
public class DesignerSheetView : ItemsControl
{
static DesignerSheetView()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(DesignerSheetView), new FrameworkPropertyMetadata(typeof(DesignerSheetView)));
}
}
И стиль по умолчанию установлен в DesignerSheetView.xaml:
<Style TargetType="{x:Type sheets:DesignerSheetView}" BasedOn="{StaticResource {x:Type ItemsControl}}">
<Setter Property="ItemsControl.ItemTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type items:LineItemViewModel}">
<Line X1="0" Y1="0" X2="{Binding X2}" Y2="{Binding Y2}" Stroke="{Binding Stroke}" StrokeThickness="{Binding Thickness}"/>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsControl.ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsControl.ItemContainerStyle">
<Setter.Value>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Top" Value="{Binding Path=YPos}" />
<Setter Property="Canvas.Left" Value="{Binding Path=XPos}" />
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
</Style>
</Setter.Value>
</Setter>
</Style>
Инстанцирование выглядит следующим образом в MainWindow.xaml:
<sheets:DesignerSheetView Background="Beige" ItemsSource="{Binding SheetElements}" >
</sheets:DesignerSheetView>
Моя проблема в том, что я хочу отобразить несколько типов элементов, не только LineItemViewModel, но, например, RectangleItemViewModel или EllipseItemViewModel. Я знаю, что обычно я мог бы сделать это, установив тег ItemsControl.Resources. Я нашел это , это и это вопросы, но они используют UserControls (?), А не CustomControl со стилем по умолчанию.
Какдобавить несколько ItemTemplates в этом случае? Я полагаю, что одним из вариантов было бы установить ресурсы в MainWindow.xaml при создании экземпляра, например:
<sheets:DesignerSheetView Background="Beige" ItemsSource="{Binding SheetElements}" >
<ItemsControl.ItemTemplate>
<DataTemplate DataType="...">
</DataTemplate>
<DataTemplate DataType="...">
</DataTemplate>
</ItemsControl.ItemTemplate>
</sheets:DesignerSheetView>
Но я бы хотел избежать этого и как-то сохранить элемент управления в коробке, чтобы сохранить все шаблоны, стили и т. д. вместе в папке DesignerSheetView, если это возможно, в отдельных файлах.
Еще лучше было бы сохранить ItemTemplates xxxItemViewModels в отдельной сборке. Является ли это возможным? Как мне это сделать?