CustomControl ItemsControl с несколькими таблицами данных - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть пользовательский элемент управления, который подклассов 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 в отдельной сборке. Является ли это возможным? Как мне это сделать?

...