I have a view model that consist of some nodes and some connectors:
public class ViewModel
{
public List<Node> Nodes{get;set;}
public List<Connector> Connectors{get;set;}
}
public Class Node
{
public Point Position{get;set;}
}
public class Connector
{
public Node StartNode{get;set;}
public Node EndNode{get;set;}
}
Now I display nodes in page by an items control:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<local:ElementThumbConverter x:Key="ElementThumbConverter"/>
<local:ElementThumbConverter2 x:Key="ElementThumbConverter2"/>
<Style x:Key="ElementThumbVMDataTemplateStyle" TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding CanvasLeft,Mode=TwoWay}" />
<Setter Property="Canvas.Top" Value="{Binding CanvasTop,Mode=TwoWay}" />
<!--<Setter Property="Canvas.Top" Value="{Binding RelativeSource={RelativeSource Self},Path=ContentTemplate.elementThumb.(Canvas.Top), Mode=TwoWay}" />-->
</Style >
<DataTemplate DataType="{x:Type vm:ElementThumbVM}">
<!--Canvas.Left="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContentPresenter},Path=(Canvas.Left),Mode=TwoWay}"-->
<kw:ElementThumb Name="elementThumb" Tag=""
Canvas.Left="{Binding CanvasLeft,Mode=TwoWay}"
Canvas.Top="{Binding CanvasTop,Mode=TwoWay}">
</kw:ElementThumb>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ElementType}">
<DataTrigger.Value>
<vm:ElementType>BusinessServer</vm:ElementType>
</DataTrigger.Value>
<Setter TargetName="elementThumb" Property="Style" Value="{StaticResource BussinesServerStyle}"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementType}">
<DataTrigger.Value>
<vm:ElementType>DataBase</vm:ElementType>
</DataTrigger.Value>
<Setter TargetName="elementThumb" Property="Style" Value="{StaticResource DataBaseStyle}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ConnectorVM}">
<kw:Connector>
<kw:Connector.StartElementThumb>
<Binding Converter="{StaticResource ElementThumbConverter2}">
<Binding.Source>
<MultiBinding Converter="{StaticResource ElementThumbConverter}">
<Binding Path="ElementThumbVMStartId" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=kw:DiagramCanvas}"/>
</MultiBinding>
</Binding.Source>
</Binding>
</kw:Connector.StartElementThumb>
<kw:Connector.EndElementThumb>
<Binding Converter="{StaticResource ElementThumbConverter2}">
<Binding.Source>
<MultiBinding Converter="{StaticResource ElementThumbConverter}">
<Binding Path="ElementThumbVMEndId" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=kw:DiagramCanvas}"/>
</MultiBinding>
</Binding.Source>
</Binding>
</kw:Connector.EndElementThumb>
</kw:Connector>
</DataTemplate>
</ResourceDictionary>
</UserControl.Resources>
<ItemsControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding AllElements}" x:Name="mainCanvasControl"
ItemContainerStyle="{StaticResource ElementThumbVMDataTemplateStyle}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<kw:DiagramCanvas Name="mainCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
As you see I have displaying template for nodes and connector, it work fine for nodes, but for connector I need to gets its corresponding start and end node so when a node in UI change its position I can track its change and reflects it in connector, I also need finally displaying with and height of displaying node (I say ElmenetThumb). In short, each node in model has a analogous ElmenetThumb in page I want to pass analogous ElmenetThumb of start and end nodes to analogous element of connector for position tracking. I trying to do that by connector as you can see in above code, but it doesn't work because in the time of calling convert content of ItemsControl not built completely.