【问题标题】:Refer to an individual ListBoxItem引用单个 ListBoxItem
【发布时间】:2011-08-26 14:55:25
【问题描述】:

我有一个显示数据的列表框,每个项目都有一个小边框。问题是我只想要项目之间的边框,而不是列表的顶部或底部。我想如果我可以检索列表中的第一个 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>

可以这样做吗?

【问题讨论】:

  • 您是否正在寻找每个项目周围的边框或每个项目之间的分隔线?

标签: wpf listbox border listboxitem


【解决方案1】:

两种方法:

一个是在视图模型中实现一个布尔值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>

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

【讨论】:

  • 谢谢,我想我会尝试其中一个
  • 第一个工作正常,似乎最简单,所以我没有费心尝试第二个。谢谢!
【解决方案2】:

订阅 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();
         }

【讨论】:

  • 我如何轻松地命名边界?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2016-12-30
  • 2015-05-28
相关资源
最近更新 更多