我有一个显示数据的列表框,每个项目都有一个小边框。问题是我只想要项目之间的边界,而不是列表的顶部或底部。我想如果我可以检索列表中的第一个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>
有可能这样做吗?
答案 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();
}