ListBox默认为项的ToString(),而不考虑DataTemplate



我试图在我的应用程序中添加一个简单的可视化,表示页面上的打印边距,以帮助用户避免定位可能超出范围的数据。要做到这一点,我有一种方法,它获取纸张大小、DPI和边距设置信息,并使用它来制作一个ObservableCollection(Rect),其中包含四个Rect,每个Rect用于页面的每个边缘。XAML中的ListBox通过返回集合的GetMargins()属性绑定到集合。我在托管ListBox的网格的Resource部分为页面定义了一个DataTemplate,ListBox在ItemsPanelTemplate中使用Canvas,这样我就可以使用每个Rect的x、y、宽度和高度在页面上定位和调整一些矩形的大小。这是XAML:

在网格中。资源:

<!--
A data template for the page margins.
-->
<DataTemplate DataType="{x:Type local:Page}">
    <Grid>
        <Rectangle
            Width="{Binding Width}"
            Height="{Binding Height}"
            Fill="LightGreen"
            Opacity="0.5"
            />
    </Grid>             
</DataTemplate>

网格中:

<!--
Listbox to present the page margins.
-->
<ListBox
    x:Name="PageMarginsListBox"
    ItemsSource="{Binding GetMargins}"
    Background="Transparent"
    IsHitTestVisible="False"
    >
    <ListBox.ItemsPanel>
         <ItemsPanelTemplate>
              <Canvas />
         </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemContainerStyle>
         <Style TargetType="ListBoxItem">
              <Setter
                   Property="Canvas.Left"
                   Value="{Binding X}"                        
                   />
              <Setter
                   Property="Canvas.Top"
                   Value="{Binding Y}"                        
                   />
         </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

当我运行应用程序时,上面的代码会导致字符串输出,而不是页面边框上的浅绿色矩形。例如,左侧边距的矩形将显示为"0,0,751650",而不是一个宽75像素、横跨整个页面高度的矩形。底部边距字符串位于左下角,右边距显示在右上角,如预期的那样。因此,装订工作正常,它们的位置正确,但由于某种原因没有绘制。

我发现有趣的是,我有另一个ObservableCollection,里面装满了我自己设计的对象,它们在页面表面的位置和样式几乎相同。绑定到该集合的ListBox的XAML以完全相同的方式设置,但每个项都有一个稍微复杂一些的DataTemplate(9个矩形而不是一个)。它运行得很好。他们也住在同一个格子里。

所以我看不出这个问题出在哪里,只是如果我得到的是toString()输出,它可能是一个DataTemplate问题。想法?发现我的错误了吗?

感谢:)

在我看来,DataTemplate中的DataType错误。GetMargins()返回Rect的ObservableCollection对吗?然后从Rect创建ListboxItems,同时为Page类定义DataTemplate。

相关内容

最新更新