请参阅单个ListBoxItem

时间:2011-08-26 14:55:25

标签: wpf listbox border listboxitem

我有一个显示数据的列表框,每个项目都有一个小边框。问题是我只想要项目之间的边界,而不是列表的顶部或底部。我想如果我可以检索列表中的第一个ListBoxItem,我可以将它的边框厚度设置为0.0,这意味着边框只出现在列表项之间。

<ListBox Name="PerformanceList" ItemsSource="{Binding JFifoCollection}" HorizontalContentAlignment="Stretch">
                        <ListBox.ContextMenu>
                            <ContextMenu>
                                <MenuItem Name="ClearPerf" Click="MenuItem_Click" Header="Clear" />
                            </ContextMenu>
                        </ListBox.ContextMenu>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Border BorderThickness="0,1,0,0" BorderBrush="#ff000099">
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="100" />
                                            <ColumnDefinition Width="100" />
                                            <ColumnDefinition />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition />
                                            <RowDefinition />
                                            <RowDefinition />
                                            <RowDefinition />
                                            <RowDefinition />
                                            <RowDefinition />
                                        </Grid.RowDefinitions>
                                        <TextBlock Text="{Binding Path=tid}" Grid.Column="0" Grid.RowSpan="6" FontSize="65pt" VerticalAlignment="Center" />
                                        <TextBlock Grid.Column="1" Grid.Row="0" FontWeight="Bold">hwcrc</TextBlock>
                                        <TextBlock Text="{Binding Path=HWCRC}" Grid.Column="2" Grid.Row="0" />
                                        <TextBlock Grid.Column="1" Grid.Row="1" FontWeight="Bold">frame count</TextBlock>
                                        <TextBlock Text="{Binding Path=Frames}" Grid.Column="2" Grid.Row="1" />
                                        <TextBlock Grid.Column="1" Grid.Row="2" FontWeight="Bold">fps</TextBlock>
                                        <TextBlock Text="{Binding Path=FPS}" Grid.Column="2" Grid.Row="2" />
                                        <TextBlock Grid.Column="1" Grid.Row="3" FontWeight="Bold">faults</TextBlock>
                                        <TextBlock Text="{Binding Path=Faults}" Grid.Column="2" Grid.Row="3" />
                                        <TextBlock Grid.Column="1" Grid.Row="4" FontWeight="Bold">info</TextBlock>
                                        <TextBlock Text="{Binding Path=Info}" Grid.Column="2" Grid.Row="4" />
                                        <TextBlock Grid.Column="1" Grid.Row="5" FontWeight="Bold">config</TextBlock>
                                        <TextBlock Text="{Binding Path=Config}" Grid.Column="2" Grid.Row="5" />
                                    </Grid>
                                </Border>
                                <DataTemplate.Triggers>
                                </DataTemplate.Triggers>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

有可能这样做吗?

2 个答案:

答案 0 :(得分:2)

两种方法:

一种是在视图模型中实现一个布尔IsFirstItem属性,当项是任何包含它的集合中的第一个项时,该属性设置为true。 (这假设一个项目只能包含一个集合,并且该项目可以访问其包含的集合,但并非总是如此。)然后向Border添加样式:

<Style TargetType="Border">
   <Setter Property="BorderThickness" Value="0,1,0,0"/>
   <Style.Triggers>
      <DataTrigger Binding="{Binding IsFirstItem}" Value="True">
         <Setter Property="BorderThickness" Value="0"/>
      </DataTrigger>
   </Style.Triggers>
</Style>

另一种方法是创建一个占位符对象并将其添加到集合的结尾(或开头)。然后使用模板选择使用与普通项目不同的模板进行渲染,例如:

<ListBox.Resources>
   <DataTemplate TargetType="{x:Type MyRealItem}">
      <!-- what most items should look like -->
   </DataTemplate>
   <DataTemplate TargetType="{x:Type MyPlaceholderItem}">
      <!-- what the placeholder item should look like -->
   </DataTemplate>
</ListBox.Resources>
<ListBox.ItemTemplate>
   <DataTemplate>
      <ContentPresenter Content="{Binding}"/>
   </DataTemplate>
</ListBox.ItemTemplate>

如果它在最后,例如,你可以给占位符一个负边缘宽度与边框厚度相同 - 所以基本上你是在底部边框顶部绘制一个背景颜色的矩形。列表中的最后一项。

答案 1 :(得分:1)

订阅ListBox上加载的事件处理程序,并为要更改的边框指定名称。在加载的事件处理程序中执行以下操作:

        if (listbox.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
        {
                ListBoxItem container = listView.ItemContainerGenerator.ContainerFromItem(listbox.Items[0]) as ListViewItem;
                Border border = container.Template.FindName("borderName",container) as Border;
                if (border != null)
                   border.BorderThickness = new Thickness();
         }