我有一個帶有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