Как можно добавить разделитель между элементами в ItemsControl

Мне нужно отобразить список чисел из коллекции в элементе управления. Таким образом, элементы: "1", "2", "3" .

Когда они оказываются, я нуждаюсь в них, разделенных запятой (или чем-то подобным). Таким образом, вышеуказанные 3 элемента будут выглядеть так: "1, 2, 3" .

Как добавить разделитель к отдельным элементам, без привязки к концу списка?

Я не зацикливаюсь на использовании ItemsControl, но это то, что я начал использовать.

                      

Я пришел к вашему вопросу, потому что искал решение в Silverlight, у которого нет предыдущего относительного источника данных.

Текущий принятый ответ дал мне ошибку привязки xaml для каждого шаблона, что, я думаю, может повлиять на производительность. Вместо этого я сделал следующее, используя AlternationIndex, чтобы скрыть первый разделитель. (Вдохновленный этим ответом .)

                     

Для более обобщенного решения, совместимого с Silverlight, я получил элемент управления из ItemsControl (SeperatedItemsControl). Каждый элемент завернут в SeperatedItemsControlItem, как ListBoxItem ListBox. Шаблон для SeperatedItemsControlItem содержит разделитель и ContentPresenter. Сепаратор для первого элемента коллекции скрыт. Вы можете легко изменить это решение, чтобы сделать горизонтальный разделитель строк между элементами, для чего я его создал.

MainWindow.xaml:

                 

Код C #:

 using System; using System.Windows; using System.Windows.Controls; namespace ItemsControlWithSeperator { public class ViewModel { public string[] Data { get { return new[] { "Amy", "Bob", "Charlie" }; } } } public class SeperatedItemsControl : ItemsControl { public Style ItemContainerStyle { get { return (Style)base.GetValue(SeperatedItemsControl.ItemContainerStyleProperty); } set { base.SetValue(SeperatedItemsControl.ItemContainerStyleProperty, value); } } public static readonly DependencyProperty ItemContainerStyleProperty = DependencyProperty.Register("ItemContainerStyle", typeof(Style), typeof(SeperatedItemsControl), null); protected override DependencyObject GetContainerForItemOverride() { return new SeperatedItemsControlItem(); } protected override bool IsItemItsOwnContainerOverride(object item) { return item is SeperatedItemsControlItem; } protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { //begin code copied from ListBox class if (object.ReferenceEquals(element, item)) { return; } ContentPresenter contentPresenter = element as ContentPresenter; ContentControl contentControl = null; if (contentPresenter == null) { contentControl = (element as ContentControl); if (contentControl == null) { return; } } DataTemplate contentTemplate = null; if (this.ItemTemplate != null && this.DisplayMemberPath != null) { throw new InvalidOperationException(); } if (!(item is UIElement)) { if (this.ItemTemplate != null) { contentTemplate = this.ItemTemplate; } } if (contentPresenter != null) { contentPresenter.Content = item; contentPresenter.ContentTemplate = contentTemplate; } else { contentControl.Content = item; contentControl.ContentTemplate = contentTemplate; } if (ItemContainerStyle != null && contentControl.Style == null) { contentControl.Style = ItemContainerStyle; } //end code copied from ListBox class if (this.Items.Count > 0) { if (object.ReferenceEquals(this.Items[0], item)) { var container = element as SeperatedItemsControlItem; container.IsFirstItem = true; } } } protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { base.OnItemsChanged(e); if (Items.Count > 1) { var container = (ItemContainerGenerator.ContainerFromIndex(1) as SeperatedItemsControlItem); if (container != null) container.IsFirstItem = false; } if (Items.Count > 0) { var container = (ItemContainerGenerator.ContainerFromIndex(0) as SeperatedItemsControlItem); if (container != null) container.IsFirstItem = true; } } } public class SeperatedItemsControlItem : ContentControl { private bool isFirstItem; public bool IsFirstItem { get { return isFirstItem; } set { if (isFirstItem != value) { isFirstItem = value; var seperator = this.GetTemplateChild("seperator") as FrameworkElement; if (seperator != null) { seperator.Visibility = isFirstItem ? Visibility.Collapsed : Visibility.Visible; } } } } public override void OnApplyTemplate() { base.OnApplyTemplate(); if (IsFirstItem) { var seperator = this.GetTemplateChild("seperator") as FrameworkElement; if (seperator != null) { seperator.Visibility = Visibility.Collapsed; } } } } } 

Вы также можете использовать multibind для ItemsControl.AlternationIndex и ItemsControl.Count и сравнивать AlternationIndex с Count, чтобы узнать, являетесь ли вы последним элементом.

Установите AlternationIndex достаточно высоко, чтобы разместить все ваши предметы, а затем создайте LastItemConverter с помощью метода Convert, который выглядит примерно так:

  public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { var alterationCount = (int)values[0]; var itemCount = (int)values[1]; if (itemCount > 1) { return alterationCount == (itemCount - 1) ? Visibility.Collapsed : Visibility.Visible; } return Visibility.Collapsed; } 

Я решил, что должен дать решение, в котором я оказался.

Я закончил привязывать свою коллекцию элементов к тексту TextBlock и использовать конвертер значений для изменения связанной коллекции элементов в форматированную строку.

  • Можно ли выбрать текстовый блок WPF?
  • Группировка элементов в ComboBox
  • Почему я не могу ссылаться на System.ComponentModel.DataAnnotations?
  • Как я могу получить DPI в WPF?
  • WPF StringFormat на содержании ярлыков
  • Как связать массив байтов с изображением в WPF с преобразователем значений?
  • В каких сценариях замораживание объектов WPF значительно повышает производительность?
  • Как привязать DataTable к Datagrid
  • Диспетчер WPF {«вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream».}
  • WrapPanel как ItemPanel для ItemsControl
  • WPF / C #: Где я должен сохранять файлы пользовательских настроек?
  • Давайте будем гением компьютера.