我有一个ItemsControl
,我用它在画布上绘制两组不同的形状。因此,我有两个包含Edge对象和Node对象的ItemsSource
。在ItemsControl中为特定项目类型设置样式
我有两种不同的DataTemplates
为每种类型。但是,我需要设置节点的画布定位,但不是边缘。互联网上有很多关于如何使用单个ItemsSource
来做到这一点的例子,但是在我的情况下不能使用多个例子。
我已经像这样破解了它,但是这会在输出窗口中引发很多绑定错误(因为只有Nodes具有Position
属性,而不是边缘,因此这是“有效的”)。另外,我想分别为节点和边缘设置ZIndex
,这是不可能的。有没有人有什么建议?
<ItemsControl>
<ItemsControl.ItemsSource>
<MultiBinding>
<MultiBinding.Converter>
<p:CompositeCollectionConverter/>
</MultiBinding.Converter>
<Binding Path="Graph.Nodes"/>
<Binding Path="Graph.Edges"/>
</MultiBinding>
</ItemsControl.ItemsSource>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type model:Edge}">
<Path
Stroke="Blue"
Data="{Binding Path=EdgeSegments, Converter={StaticResource EdgeSegmentsConverter}}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type model:Node}">
<Ellipse
Width="8"
Height="8"
Stroke="Black"
Fill="Gray"/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left">
<Setter.Value>
<Binding Path="Position.X">
<Binding.Converter>
<p:NodePositionConverter />
</Binding.Converter>
</Binding>
</Setter.Value>
</Setter>
<Setter Property="Canvas.Top">
<Setter.Value>
<Binding Path="Position.Y">
<Binding.Converter>
<p:NodePositionConverter />
</Binding.Converter>
</Binding>
</Setter.Value>
</Setter>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
我再次重新讨论这个问题,并尝试了解决方案。它运作得非常漂亮,比我的解决方案更优雅,因此已经接受了您的答案。谢谢! – Kazu