ItemControl DataTemplate со списком UIElement - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь разработать библиотеку пользовательских элементов управления, которая упорядочивает несколько элементов UIE определенным c способом. Я использую ItemControl, чтобы показать список элементов UIE. Я хочу окружить каждый предмет из управления предметами стеком. Я хотел бы использовать мою библиотеку более или менее таким образом.

  <pcLayouts:ListLayout>

      <pcLayouts:ListLayout.ParentItems>
          <TextBlock Width="145">1</TextBlock>
          <TextBlock>2</TextBlock>
          <TextBlock>3</TextBlock>
      </pcLayouts:ListLayout.ParentItems>

   </pcLayouts:ListLayout>


Я объявил свойство зависимостей в классах поддержки ListLayout cs и xaml.

        public static readonly DependencyProperty ParentItemsProperty = DependencyProperty.Register(
            "ParentItems", typeof(ObservableCollection<UIElement>), typeof(ColumnLayout),
            new PropertyMetadata(new ObservableCollection<UIElement>()));
...
        public ObservableCollection<UIElement> ParentItems
        {
            get { return (ObservableCollection<UIElement>)GetValue(ParentItemsProperty); }
            set
            {
                SetValue(ParentItemsProperty, value);
                OnPropertyChanged();
            }
        }
    <StackPanel x:Name="MainPanel" Orientation="Vertical">
        <ItemsControl ItemsSource="{Binding ParentItems, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                        <WHAT SHOULD I PUT HERE??/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>

Кажется, DataTemplate вообще не используется при привязке к Binding ParentItems, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}. Как я могу использовать этот шаблон данных или есть другой способ?

1 Ответ

1 голос
/ 17 марта 2020

это потому, что ItemsControl.IsItemItsOwnContainerOverride возвращает true для UIElement. Обычно используется ContentPresenter, который генерирует шаблон данных.

Если вы настаиваете на использовании DataTemplate, вы создаете новый класс, производный от ItemsControl, и переопределяете IsItemItsOwnContainerOverride для возврата false.

...