Все элементы в WPF ListBox должны быть уникальными экземплярами. Строки с одинаковым постоянным значением не являются уникальными экземплярами из-за интернирования строк. Чтобы обойти это, вам нужно заключить элемент в более значимый объект, чем строка, например:
public class DataItem
{
public string Text { get; set; }
}
Теперь вы можете создавать экземпляры нескольких экземпляров DataItem и создавать шаблон ItemDataTemplate для отображения текста в виде TextBlock. Вы также можете переопределить DataItem ToString (), если хотите использовать рендеринг по умолчанию. Теперь вы можете иметь несколько экземпляров DataItem с одним и тем же текстом и без проблем.
Это ограничение может показаться немного странным, но оно упрощает логику, поскольку теперь SelectedItem имеет взаимно-однозначное соответствие с SelectedIndex для элементов в списке. Это также соответствует подходу WPF к визуализации данных, который направлен на списки значимых объектов, а не на списки простых строк.