我有一个带有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>
是TextBox不是画布的直接子项,这是问题。但是我不想使用样式来设置包装我的LabeledArrow的整个ListBoxItem的Canvas.Top/Left,因为这弄乱了我的箭头部分的位置。如果我只是显示一个可以工作的文本框。 – Ricibob
您没有太多其他选项。箭头的位置当然必须改变以考虑新的父母位置。其他选项涉及更多的代码,可能会更混乱。这是我能给你的唯一解决方案,事实上它与我们用于图表控制的方法相同。 – dowhilefor
好的 - 经过一番考虑后,我认为你的权利 - 这是最简单的解决方案。干杯。 (我检查了你的articy:草稿应用程序的屏幕截图 - 看起来不错!) – Ricibob