Есть ли способ избежать генерации ContentPresenter
, чтобы ItemsControl
обертывал мои предметы? Мой ItemsControl
связан с собственностью VM, и я использую DataTemplate
в своих ресурсах ItemControl (без x:Key
), чтобы настроить внешний вид объектов моей коллекции. Все это прекрасно работает, но проверка через Snoop показывает, что все мои объекты коллекции обернуты внутри ContentPresenter
s и не добавляются непосредственно к панели. Этот факт создает для меня некоторые другие проблемы. Есть ли способ избежать дополнительной упаковки?Избегайте ContentPresenter в ItemsControl
Вот XAML:
<ItemsControl ItemsSource="{Binding Path=Children}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type vm:Ellipse}">
<Ellipse Fill="{Binding Fill}" Stroke="{Binding Stroke}" />
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Focusable="true" Margin="10" FocusVisualStyle="{x:Null}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding XLoc}" />
<Setter Property="Canvas.Top" Value="{Binding YLoc}" />
<Setter Property="Canvas.ZIndex" Value="{Binding ZOrder}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
Возможно, вы можете создать производный элемент ItemsControl и переопределить метод GetContainerForItemOverride (https://msdn.microsoft.com/en-us/library/aa346422 (v = vs.110) .aspx) для прямого возврата эллипса контроль. – Clemens
@Clemens: Не будет ли ожидать, что я верну * * контейнер *, а не фактический элемент, который будет отображаться (с другой стороны, он управляется 'DataTemplate')? – dotNET
У вас больше не будет DataTemplate, иначе вам понадобится ContentPresenter. – Clemens