如何在不受ItemTemplate影响的情况下向ListBox项添加分隔符

时间:2012-01-18 18:55:51

标签: c# wpf xaml itemtemplate

您可以在下面看到View和ViewModel。 结果将是:“A B C”,每个字母的背景为红色。 我想在项目之间添加一个箭头但是我不希望箭头用红色着色。 这意味着它应该是这样的:“A - > B - > C”,只有字母将用红色着色,箭头。 我可以使用转换器在Text属性上添加箭头,但它也会最终为箭头着色。

任何想法?

的Xaml:

<ListBox ItemsSource="{Binding MyArray}">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Background="Red" Text="{Binding}" Margin="5"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

代码背后:

    public class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        MyArray = new ObservableCollection<string>();
        MyArray.Add("A");
        MyArray.Add("B");
        MyArray.Add("C");
    }
    public ObservableCollection<string> MyArray { get; set; }
}

2 个答案:

答案 0 :(得分:1)

您可以轻松地执行此操作:

  <TextBlock Margin="5">
      <Run Background="Red" Text="{Binding}"/>
      <Run Text="->"/>
  </TextBlock>

或者,如果您真的必须将其保留在数据模板之外,请使用ItemContainerStyle并为Template分配一个新的ListBoxItem,其中包含ContentPresenter旁边的箭头项目模板的位置(这可能是一个好主意,因为你可以阻止箭头选择)。

编辑:我会使用带有PreviousData绑定的附加箭头来处理此问题,如果它为null,则前面没有任何项目:

<DataTemplate>
    <!-- StackPanel because Runs can't be collapsed, you could clear their text though -->
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="->">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger
                                Binding="{Binding RelativeSource={RelativeSource PreviousData}}"
                                Value="{x:Null}">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
        <TextBlock Text="{Binding}" Background="Red" />
    </StackPanel>
</DataTemplate>

答案 1 :(得分:0)

如果您知道收藏中的最大商品数量,则可以将AlternationCount的{​​{1}}设置为高于收藏中商品数量的数字,然后使用{ {1}}确定分隔符项的可见性或文本。

ListBox

修改

正如HB在他的回答中指出的那样,您也可以将DataTrigger作为RelativeSource.PreviousData的基础,但只有<Style x:Key="ArrowTextBlockStyle" TargetType="{x:Type TextBlock}"> <Setter Property="Text" Value="->" /> <Style.Triggers> <DataTrigger Value="0" Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=(ItemsControl.AlternationIndex)}"> <Setter Property="Text" Value="" /> </DataTrigger> </Style.Triggers> </Style> <ListBox AlternationCount="100" ItemsSource="{Binding MyArray}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Style="{StaticResource ArrowTextBlockStyle}" /> <TextBlock Text="{Binding }" Background="Red" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 中的所有项目都不是DataTrigger时才会有效}