 <p>The answer was increadibly simple, thanks for the reference to <code>ICollectionViewLiveShaping.IsLiveSortin</code> from @KornMuffin. </p> <p><a href="https://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionviewliveshaping.islivesorting(v=vs.110).aspx" rel="nofollow">https://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionviewliveshaping.islivesorting(v=vs.110).aspx</a></p> <p>Here were my steps to implement and resolve this.</p> <p>In my AlarmView.xaml code behind I added a static variable that contains the instance of the AlarmView that is created.</p> <p>Here is the constructor of the AlarmView</p> <pre><code>public partial class AlarmsView : UserControl { public static AlarmsView View; public AlarmsView() { InitializeComponent(); View = this; this.DataContext = new ViewModel.AlarmsViewModel(); } } </code></pre> <p>I created the static view because I need access to the datagrid from the ViewModel for an event (will get to this in a moment)</p> <p>In the AlarmViewModel.cs there is the <code>ObservableCollection</code></p> <pre><code> public CollectionViewSource ViewSource { get; set; } public ObservableCollection&lt;Model.AlarmItem&gt; Collection { get; set; } </code></pre> <p>Then, in the constructor of the <code>AlarmViewModel</code>, I instantiated the <code>ObservableCollection</code> and using <code>ICollectionViewLiveShaping</code> set the <code>.IsLiveSorting</code> to true. Here, I also make use of the static variable created in the AlarmView code behind to gain access to the datagrid so we can hook into the <code>.Sorting</code> event.</p> <pre><code> public AlarmsViewModel() { if (_alarmItemRepository == null) _alarmItemRepository = new AlarmItemRepository(); this.Collection = new ObservableCollection&lt;Model.AlarmItem&gt;(_alarmItemRepository.GetAlarmItems()); ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.Collection); collectionView.SortDescriptions.Add(new SortDescription("NextSpawn", ListSortDirection.Ascending)); var view = (ICollectionViewLiveShaping)CollectionViewSource.GetDefaultView(this.Collection); view.IsLiveSorting = true; // Bind to the sorting event of the datagrid in the AlarmView AlarmsView.View.dgAlarms.Sorting += DgAlarms_Sorting; // Other code // ... // ... } </code></pre> <p>Then, in the sorting event handling, we update the sort description when a user clicks a column header to sort the column.</p> <pre><code> private void DgAlarms_Sorting(object sender, DataGridSortingEventArgs e) { ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.Collection); collectionView.SortDescriptions.Add(new SortDescription(e.Column.SortMemberPath, e.Column.SortDirection.GetValueOrDefault())); } </code></pre>