Я сделал исправление, похожее на Джеймса.Добавление логического поля в TableModel, к которому привязывался список.
У меня было дополнительное требование к данным, сгруппированным по типам, которое я оставил в запросе LINQ ниже.Если вам это не нужно, вы можете использовать allData.Count вместо numDataTypes.Моя логическая переменная называлась IsLastItem и была заполнена:
int numDataTypes = allData.Select(o => o.Type).Distinct().Count();
IEnumerable<TableModel> ByTypes = allData
.GroupBy(o => o.Type)
.Select((g, index) => new TableModel()
{
...
IsLastItem = index == (numDataTypes - 1),
});
Затем в ListBox (или ItemsControl) я использовала конвертер Boolean to Visibility (аналогичный тому, который был опубликован здесь Silverlight 4: как переключатьсяконтроль видимости ):
<ItemsControl ItemsSource="{Binding ByTypes}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
...
<!-- Seperator between list items -->
<Rectangle Grid.Row="3" Height="20" Visibility="{Binding IsLastItem, Converter={StaticResource VisibileWhenFalseConverter}}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>