Implementation of ApplySort method from IBindingList
The ApplySortCore() method could be made more dry  

protected virtual void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
    this.SortProperty = property;
    this.SortDirection = direction;

    IEnumerable&lt;T&gt; items = null;
    if (direction == ListSortDirection.Ascending)
    {
        items = this.OrderBy(item =&gt; property.GetValue(item));
    }
    else
    {
        items = this.OrderByDescending(item =&gt; property.GetValue(item));
    }

    ResetItems(items.ToList ());

    IsSorted = true;
    OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, property));
}  




You should always try to code against interfaces instead of a concrete implementation.  

In the ResetItems() method you should either use an IList&lt;TItem&gt; or better an IEnumerable&lt;TItem&gt; for the input parameter.  



The call to this IndexOf() method seems a little bit strange. You already have the items sorted why don't you just add the items one by one ?  

Because the methods are inherited from Collection&lt;T&gt; we can use the Add() method which simplifies the ResetItems() method to  

private void ResetItems(IEnumerbale&lt;TItem&gt; items)
{
    base.ClearItems();

    foreach (var item in items)
    {
        base.Add(item);
    }
}