Как добавить разделитель к элементам ListBox без влияния ItemTemplate - PullRequest
0 голосов
/ 18 января 2012

Ниже вы можете увидеть View и ViewModel.Результат будет: «ABC», что фон каждой буквы красный.Я хочу добавить стрелку между элементами НО Я не хочу, чтобы стрелка была окрашена красным.Это означает, что должно быть так: «A -> B -> C», что ТОЛЬКО буквы будут окрашены в красный цвет, а стрелки НЕ .Я могу использовать Конвертер, чтобы добавить стрелку в поле Текст, но он также окрасит стрелку.

Любая идея?

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 ]

1 голос
/ 18 января 2012

Вы можете легко сделать это:

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

Или, если вам действительно необходимо исключить его из шаблона данных, используйте ItemContainerStyle и назначьте новый Template для ListBoxItem, который содержит стрелку рядом с ContentPresenter, где Шаблон элемента будет (это может быть хорошей идеей, поскольку вы можете предотвратить появление выбранной стрелки).

Редактировать: Я хотел бы подойти к вопросу с дополнительной стрелкой с привязкой PreviousData, если она равна нулю, перед ней нет элемента:

<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>
0 голосов
/ 18 января 2012

Если вам известно максимальное количество элементов в вашей коллекции, вы можете установить AlternationCount вашего ListBox на число, которое больше, чем количество элементов в вашей коллекции, а затем используйте DataTrigger для определения видимость или текст ваших разделителей.

<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>

Редактировать

Как указал HB в своем ответе, вы также можете основать свой DataTrigger на RelativeSource.PreviousData , однако это сработает, только если ни один из элементов в вашем ItemsSource не будет null

...