尽管DataTemplate,ListBox默认为ToString()

时间:2012-08-03 15:11:45

标签: wpf visual-studio-2010 listbox datatemplate observablecollection

我正在尝试为我的应用程序添加一个简单的视觉效果,表示页面上的打印边距,以帮助用户避免定位可能超出范围的数据。为此,我有一个方法,它获取纸张大小,DPI和边距设置信息,并使用它来制作一个ObservableCollection(Rect),它包含四个Rect,每个边对应一个。 XAML中的ListBox通过返回集合的GetMargins()属性绑定到集合。我在托管ListBox的Grid的Resource部分为页面定义了一个DataTemplate,ListBox在ItemsPanelTemplate中使用了Canvas,这样我就可以使用每个Rect的x,y,width和height在页面上定位和调整一些Rectangle的大小。 。这是XAML:

在Grid.Resources中:

<!--
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>

当我运行应用程序时,上面的代码会导致字符串输出而不是页面边框上的浅绿色矩形。例如,左侧边距的Rect将显示为“0,0,75,1650”,而不是宽度为75px的矩形,并且跨越整个页面的高度。底部边距字符串位于左下角,右边距显示在右上角,正如预期的那样。所以绑定工作正常,它们定位正确,但由于某种原因没有绘制。

我觉得有趣的是我有另一个ObservableCollection填充了我自己设计的对象,这些对象在Page的表面上以几乎相同的方式定位和设置样式。绑定到该集合的ListBox的XAML设置方式完全相同,但每个项目的DataTemplate稍微复杂一些(9个矩形而不是一个)。它运作得很好。他们也住在同一个网格中。

所以我没有看到我在这个问题上出错了,只是如果我得到toString()输出它可能是一个DataTemplate问题。思考?发现我的错误?

谢谢:)

1 个答案:

答案 0 :(得分:0)

在我看来,你在DataTemplate中有错误的DataType。 GetMargins()返回Rect的ObservableCollection对吗?然后ListboxItems是从Rect创建的,而您的DataTemplate是为Page class。

定义的