具有多个数据模板的CustomControl ItemsControl

时间:2019-11-04 16:07:52

标签: wpf custom-controls itemscontrol

我有一个自定义控件,该控件将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标记来做到这一点。 我发现了thisthisthis个问题,但它们使用的是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保留在单独的程序集中。可能吗?我该怎么办?

0 个答案:

没有答案