 <p>Try using <code>ICollectionViews</code> in combination with <code>IsSynchronizedWithCurrentItem</code> property when handling lists / ObservableCollection in Xaml. The ICollectionView in the viewmodel can handle all the things needed, e.g. sorting, filtering, keeping track of selections and states.</p> <p>Xaml:</p> <pre><code>&lt;Window x:Class="ComboBoxBinding.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"&gt; &lt;Grid&gt; &lt;Grid.ColumnDefinitions&gt; &lt;ColumnDefinition /&gt; &lt;ColumnDefinition /&gt; &lt;/Grid.ColumnDefinitions&gt; &lt;ListBox Grid.Column="0" ItemsSource="{Binding Reports}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True" /&gt; &lt;ComboBox Grid.Column="1" ItemsSource="{Binding CurrentReport.Performances}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True" /&gt; &lt;/Grid&gt; &lt;/Window&gt; </code></pre> <p>ViewModel:</p> <pre><code>public class ViewModel : INotifyPropertyChanged { private readonly IReportService _reportService; private ObservableCollection&lt;ReportViewModel&gt; _reports = new ObservableCollection&lt;ReportViewModel&gt;(); private PerformanceViewModel _currentPerformance; private ReportViewModel _currentReport; public ObservableCollection&lt;ReportViewModel&gt; Reports { get { return _reports; } set { _reports = value; OnPropertyChanged("Reports");} } public ReportViewModel CurrentReport { get { return _currentReport; } set { _currentReport = value; OnPropertyChanged("CurrentReport");} } public PerformanceViewModel CurrentPerformance { get { return _currentPerformance; } set { _currentPerformance = value; OnPropertyChanged("CurrentPerformance");} } public ICollectionView ReportsView { get; private set; } public ICollectionView PerformancesView { get; private set; } public ViewModel(IReportService reportService) { if (reportService == null) throw new ArgumentNullException("reportService"); _reportService = reportService; var reports = _reportService.GetData(); Reports = new ObservableCollection&lt;ReportViewModel&gt;(reports); ReportsView = CollectionViewSource.GetDefaultView(Reports); ReportsView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); ReportsView.CurrentChanged += OnReportsChanged; ReportsView.MoveCurrentToFirst(); } private void OnReportsChanged(object sender, EventArgs e) { var selectedReport = ReportsView.CurrentItem as ReportViewModel; if (selectedReport == null) return; CurrentReport = selectedReport; if(PerformancesView != null) { PerformancesView.CurrentChanged -= OnPerformancesChanged; } PerformancesView = CollectionViewSource.GetDefaultView(CurrentReport.Performances); PerformancesView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); PerformancesView.CurrentChanged += OnPerformancesChanged; PerformancesView.MoveCurrentToFirst(); } private void OnPerformancesChanged(object sender, EventArgs e) { var selectedperformance = PerformancesView.CurrentItem as PerformanceViewModel; if (selectedperformance == null) return; CurrentPerformance = selectedperformance; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } </code></pre>