我有一个自定义控件,该控件将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标记来做到这一点。 我发现了this,this和this个问题,但它们使用的是UserControls(?),而不是具有默认样式的CustomControl。
在这种情况下,如何添加多个ItemTemplate?我猜一个选择是在实例化时设置MainWindow.xaml中的资源,如下所示:
<sheets:DesignerSheetView Background="Beige" ItemsSource="{Binding SheetElements}" >
<ItemsControl.ItemTemplate>
<DataTemplate DataType="...">
</DataTemplate>
<DataTemplate DataType="...">
</DataTemplate>
</ItemsControl.ItemTemplate>
</sheets:DesignerSheetView>
但是我想避免这种情况,并以某种方式将控件装箱,以将所有模板,样式等一起保存在DesignerSheetView文件夹中,如果可能的话,放在单独的文件中。
更好的办法是将xxxItemViewModels的ItemTemplates保留在单独的程序集中。可能吗?我该怎么办?