【发布时间】:2014-04-15 11:53:48
【问题描述】:
我有一个ItemsControl,我用它在画布上绘制两组不同的形状。因此,我有两个 ItemsSource 包含 Edge 对象和 Node 对象。
每种类型都有两个不同的DataTemplates。但是,我需要为节点设置画布定位,而不是边缘。互联网上有大量关于如何使用单个 ItemsSource 执行此操作的示例,但没有像我的情况那样使用多个。
我已经像这样破解了它,但这会在输出窗口中引发很多绑定错误(因为只有节点具有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>
【问题讨论】: