ItemsControl с несколькими шаблонами данных и общим заголовком для каждого элемента - PullRequest
0 голосов
/ 19 октября 2018

У меня есть куча относительно простых моделей.Все они реализуют общий интерфейс:

public interface IComponent : INotifyPropertyChanged
{
    bool IsExpanded { get; }
    string Header { get; }
    ICommand AddComponentCommand { get; }
    ICommand DeleteComponentCommand { get; }
}

Я хочу, чтобы все мои модели представления имели свои собственные DataTemplate, чтобы они были правильно расположены.Я также хочу, чтобы элементы управления имели заголовок с кнопкой добавления и удаления.Если была нажата кнопка «Добавить», у элемента управления есть содержимое, и оно будет «видимым» при использовании расширителя.

Мне удалось получить DateTemplates, работающий с ItemsControl.

C # Main viewmodel

private ObservableCollection<IComponent> _components = new ObservableCollection<IComponent>();
public ObservableCollection<IComponent> Components
{
    get => _components;
    set => SetField(ref _components, value);
}

xaml:

<ItemsControl ItemsSource="{Binding Components}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>


    <ItemsControl.Resources>
        <!-- FailCost -->
        <DataTemplate DataType="{x:Type viewModel:CarViewModel}">
            <Border BorderBrush="Black">
                <StackPanel>
                    <TextBlock Text="{Binding Header}"/>
                    <Button Content="Add" Command="{Binding AddComponentCommand}"/>
                    <Button Content="Del" Command="{Binding DeleteComponentCommand}"/>
                    <Expander IsExpanded="{Binding IsExpanded, Mode=OneWay}">
                        <TextBox Text="{Binding Car.Brand}"/>
                    </Expander>
                </StackPanel>
            </Border>
        </DataTemplate>

        <DataTemplate DataType="{x:Type viewModel:PersonViewModel}">
            <Border BorderBrush="Black">
                <StackPanel>
                    <TextBlock Text="{Binding Header}"/>
                    <Button Content="Add" Command="{Binding AddComponentCommand}"/>
                    <Button Content="Del" Command="{Binding DeleteComponentCommand}"/>
                    <Expander IsExpanded="{Binding IsExpanded, Mode=OneWay}">
                        <TextBox Text="{Binding Person.Name}"/>
                    </Expander>
                </StackPanel>
            </Border>
        </DataTemplate>
    </ItemsControl.Resources>

</ItemsControl>

Однако теперь я должен повторять компоненты заголовка для каждого DataTemplate.У меня есть общая функциональность в интерфейсе, я не хочу повторять кнопки добавления / удаления и текст заголовка для каждого элемента.Некоторое время я гуглял, но мне кажется, что я скучаю по этой проблеме, потому что не могу найти симуляционные кейсы.

Как добавить общий заголовок ко всем элементам в моем ItemsControl.

Для ясности: мне не нужен HeaderItemsControl, мне не нужен мой ItemsControl, чтобы иметь заголовок.Мне нужны элементы из моего ItemsControl, чтобы все они имели одинаковый заголовок.

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете создать пользовательский ControlTemplate:

<ControlTemplate x:Key="template" TargetType="UserControl">
    <Border BorderBrush="Black">
        <StackPanel>
            <TextBlock Text="{Binding Header}"/>
            <Button Content="Add" Command="{Binding AddComponentCommand}"/>
            <Button Content="Del" Command="{Binding DeleteComponentCommand}"/>
            <Expander IsExpanded="{Binding IsExpanded, Mode=OneWay}">
                <ContentPresenter />
            </Expander>
        </StackPanel>
    </Border>
</ControlTemplate>

<DataTemplate DataType="{x:Type viewModel:CarViewModel}">
    <UserControl Template="{StaticResource template}">
        <TextBox Text="{Binding Car.Brand}"/>
    </UserControl>
</DataTemplate>

<DataTemplate DataType="{x:Type viewModel:PersonViewModel}">
    <UserControl Template="{StaticResource template}">
        <TextBox Text="{Binding Person.Name}"/>
    </UserControl>
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...