【问题标题】:Incorporate a separator in listbox在列表框中加入分隔符
【发布时间】:2013-08-21 07:42:54
【问题描述】:

例如,我需要在我的 ListBoxItems 中的项目之间合并一个分隔符 我的项目源中的一些项目将放置在分隔符下方和上方。

例如:

以上是通过改变 ListBox 的 ControlTemplate 来完成的:

 <ScrollViewer>
     <StackPanel>
         <ItemsPresenter />                                        
         <Separator  BorderBrush="Red"  />
         <ListBoxItem Content=".." ContentTemplate="..."  x:Key="helpItem"/>                                    
     </StackPanel>
 </ScrollViewer>

问题是“helpItem”没有被选中,因为它不是我的 ItemsSource 的一部分。

现在可以选择就足够了

1)所以我的第一个问题是我如何将这个项目与我的 ItemsSource 或替代 让它可选择?

未来我可能不希望有更多的物品被放置在 我的列表框的下半部分

2) 我将如何在我的物品之间的给定位置物理上放置一个分隔符,好像将我的 ItemsPresenter 在一个合乎逻辑的位置?

【问题讨论】:

  • 我以前也有这个。我堆叠了多个列表框并设置了它们的边框,以使其具有单个列表框的外观,但在表面之下,每个磅都有自己的项目源。唯一棘手的一点是协调选择手势,以便最终用户的“体验”只看到一个被选中的项目。
  • 有点想避免这种情况:)
  • 如果您想使用单个控件,仍然有一个答案:从 VirtualizingStackPanel 派生一个类并为它实现您自己的 ItemsControlGenerator。我以前也这样做过,并且可以证明它会给你所追求的。不利的一面是,我不会将编写 ICG 视为一种完全愉快的体验。 :)

标签: wpf listbox listboxitem


【解决方案1】:

而不是多个ListBox 控件,如果您可以根据需要多少分隔符将您的集合分成“n”个较小的组,您可以通过CompositeCollection 将它们全部放在同一个ListBox

例如说我有:

public partial class MainWindow : Window {
  public List<string> CollA { get; set; }
  public List<string> CollB { get; set; }
  public MainWindow() {
    InitializeComponent();

    CollA = new List<string> {"A", "B", "C"};

    CollB = new List<string> {"D", "E", "F"};

    DataContext = this;
  }
}

我想要CollACollB 之间的分隔符,那么我的xaml 可能是:

<ListBox>
  <ListBox.Resources>
    <CollectionViewSource x:Key="CollectionOne"
                          Source="{Binding CollA}" />
    <CollectionViewSource x:Key="CollectionTwo"
                          Source="{Binding CollB}" />
  </ListBox.Resources>
  <ListBox.ItemsSource>
    <CompositeCollection>
      <CollectionContainer Collection="{Binding Source={StaticResource CollectionOne}}" />
      <ListBoxItem HorizontalContentAlignment="Stretch"
                    IsEnabled="False"
                    IsHitTestVisible="False">
        <Rectangle Height="2"
                    Fill="Gray" />
      </ListBoxItem>
      <CollectionContainer Collection="{Binding Source={StaticResource CollectionTwo}}" />
    </CompositeCollection>
  </ListBox.ItemsSource>
</ListBox>

应该产生:

现在项目可以正常工作,您可以绑定SelectedItem 并根据需要使用它,还可以通过根据源集合检查 SelectedItem,您可以检测当前选定项目属于哪个源列表。

【讨论】:

  • 听起来不错,我试试
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2012-03-22
相关资源
最近更新 更多