2011-10-05 175 views
2

我有一个带有Canvas ItemsPanel的ListBox。 LabeledArrow只是一个视图模型类(非可视化),它公开了像Start_X,Start_Y(箭头起点),End_X,End_Y(箭头)和Box_X,Box_Y(方块位置)等属性的视图模型类(不可视)下面显示了LabeledArrow的ListBoxItem DataTemplate。
ArrowLine X1,Y1,x2,Y2与LabeledArrow Start_X,Start_Y等属性的绑定工作正常,因为ArrowLine具有公开的坐标属性(X1等)。不过,这个盒子只是TextBlock,所以我必须设置Canvas.Top和Canvas.Left attatched属性来定位它 - 但是如下所示的绑定不起作用。
任何想法? 我是否需要打包LabeledArrow作为UserControl?ListBox将DataTemplate项绑定到ItemsPanel Canvas.Left/Top

<ListBox.Resources>   
<DataTemplate DataType="{x:Type tp:LabledArrow}"> 
    <Grid> 
    <tp:ArrowLine Stroke="Red" StrokeThickness="2" 
      X1="{Binding Path=Start_X}" Y1="{Binding Path=Start_Y}" 
      X2="{Binding Path=End_X}" Y2="{Binding Path=End_Y}" /> 
    <TextBlock Text="{Binding Path=Value}" 
       **Canvas.Left="{Binding Path=Box_X}" 
       Canvas.Top="{Binding Path=Box_Y}"** /> 
    </Grid> 
</DataTemplate> 
</ListBox.Resources> 

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas IsItemsHost="True" /> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

回答

2

您设置的附加属性Canvas.LeftCanvas.Top你的文本框,但TextBox的父是一个网格。附加属性有时用于告诉Control的父级如何布置此元素。例如Canvas,Grid和DockPanel。你想要的是在物品容器上设置两个属性,这是Canvas的直接子节点。该容器使用DataTemplate来显示其内容。

要做到这一点添加到您的列表框

<ListBox.ItemContainerStyle> 
    <Style> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Box_X}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Box_Y}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 
+0

是TextBox不是画布的直接子项,这是问题。但是我不想使用样式来设置包装我的LabeledArrow的整个ListBoxItem的Canvas.Top/Left,因为这弄乱了我的箭头部分的位置。如果我只是显示一个可以工作的文本框。 – Ricibob

+0

您没有太多其他选项。箭头的位置当然必须改变以考虑新的父母位置。其他选项涉及更多的代码,可能会更混乱。这是我能给你的唯一解决方案,事实上它与我们用于图表控制的方法相同。 – dowhilefor

+0

好的 - 经过一番考虑后,我认为你的权利 - 这是最简单的解决方案。干杯。 (我检查了你的articy:草稿应用程序的屏幕截图 - 看起来不错!) – Ricibob

0

只是胡乱猜测......

  1. 你可以在一个Canvas代替Grid
  2. 然后,让你包裹孩子LabledArrow您坐标TextBlock相对于当地的Canvas减去... Box_XStart_XBox_YStart_Y (使用multibinding和转换器这样做)

我认为这将被安装到你渴望的坐标相对画布......是不是?

+0

我认为你的建议类似于dowhilefor,可能会工作 - 但我现在有一些工作,只是通过grid/listboxitem偏移箭头位置,所以我会以此运行。干杯。 – Ricibob

相关问题