WPF ItemsControl привязан к UserControls - PullRequest
0 голосов
/ 22 мая 2019

Привязка ItemsControl к коллекции UserControl объектов работает нормально. Однако я хотел бы применить дополнительный XAML, такой как Border и т. Д.

Однако вместо Border с UserControl отображается только сам UserControl. <ItemsControl.ItemTemplate>, похоже, не имеет никакого эффекта.

Вопрос: Как создать шаблон ItemTemplate с дополнительным XAML? В настоящее время этот тег, похоже, "игнорируется".


ViewModel: ObservableCollection<UserControl> MyUserControls

<ItemsControl ItemsSource="{Binding MyUserControls, lementName=popupContainer}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border ...>
                <ContentControl Content="{Binding}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

1 Ответ

1 голос
/ 22 мая 2019

Анализ ссылочного источника показывает, что метод IsItemItsOwnContainerOverride класса ItemsControl имеет такую ​​реализацию:

protected virtual bool IsItemItsOwnContainerOverride(object item)
{
    return (item is UIElement);
}

Так что если вы передадитеколлекция элементов UIElements для ItemsSource элемента ItemsControl, эти элементы используются непосредственно как контейнеры элементов, без обычного переноса внутри ContentPresenter.Следовательно, ItemTemplate вообще не применяется.

Итак, ответ на вопрос

Как мне создать ItemTemplate с дополнительным XAML?

is: Совсем нет, если ItemsSource является коллекцией UIElements.

Вместо этого следует следовать основной идее класса ItemsControl и назначить коллекцию объектов элементов данных свойству ItemsSource.,Затем выберите соответствующие элементы управления пользовательским интерфейсом с помощью DataTemplates, в свойстве которых DataType установлены типы различных элементов данных.


Или вы создаете производный ItemsControl, который переопределяет метод IsItemItsOwnContainerOverride:

public class MyItemsControl : ItemsControl
{
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...