My question is basically this one . I thought this would help provide additional information and code that facilitates reproducing the problem.
Working with Microsoft.Windows.Controls.Ribbon.RibbonComboBox from RibbonControlsLibrary feels like going through a big swamp full of mistakes, and not what you do if you know the path around it.
Anywho. The biggest problem I encountered was binding my SelectedItem.
Below I started (after learning about RibbonGallery?). To have ItemsSource and SelectedItem in the ComboBox subelements, and even at the same level already gave me heebie-jeebies, but that seems right.
In the sample application, I set SelectedItem in the ViewModel constructor. However, when starting the application, not a single SelectedItem is displayed. Even the VS designer correctly shows the "second option"!
Application Launch:
Constructor VS: 
When debugging the SelectedItem installer, you will see several passes. After installing the โsecond optionโ in ctor for the first time (1 see. Debug log below), it will reset to null (2) (according to the external code, I consider myself in the control itself). When you open the drop-down list of the user interface, it will be set to zero again (3), and then when you select a value twice to this value (4,5). I chose the "second option", then repeated the procedure with the "first option" (6-9). This created the following log (ignoring one thousand and one exception binding from the ribbon control ...):

The bigger problem, obviously, is (2), which resets my initial choice. It looks like when the control is displayed for the first time, it is reset. A very ugly solution would be to set the value to a timer. Setting a user control in the Loaded event works for me in this sample application, but it is not so in my heavier real application. In any case, all this is wrong. Does anyone know a better solution?
Xaml:
<UserControl x:Class="WpfApplication1.RibbonComboBoxDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:r="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon" xmlns:local="clr-namespace:WpfApplication1" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <UserControl.DataContext> <local:ViewModel /> </UserControl.DataContext> <Grid> <r:Ribbon > <r:RibbonTab Header="First Tab"> <r:RibbonGroup Header="Group"> <r:RibbonComboBox > <r:RibbonGallery SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> <r:RibbonGalleryCategory ItemsSource="{Binding Controls}" DisplayMemberPath="Caption" /> </r:RibbonGallery> </r:RibbonComboBox> </r:RibbonGroup> </r:RibbonTab> <r:RibbonTab Header="Second Tab" /> </r:Ribbon> </Grid> </UserControl>
ViewModel:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; namespace WpfApplication1 { public class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public ObservableCollection<ControlBaseModel> Controls { get; private set; } private ControlBaseModel _selectedItem; public ControlBaseModel SelectedItem { get { return _selectedItem; } set { LogSelectedItemChange(value); _selectedItem = value; OnPropertyChanged("SelectedItem"); } } public ViewModel() { this.Controls = new ObservableCollection<ControlBaseModel>(); this.Controls.Add(new ControlBaseModel() { Caption = "first option" }); this.Controls.Add(new ControlBaseModel() { Caption = "second option" }); this.SelectedItem = this.Controls[1]; // set to second option } int i = 0; private void LogSelectedItemChange(ControlBaseModel value) { i++; string setObject = "null"; if (value != null) { setObject = value.Caption; } Debug.WriteLine(string.Format("{0}: SelectedItem.set(): {1}", i, setObject)); } } public class ControlBaseModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged("Name"); } } private string _caption; public string Caption { get { return _caption; } set { _caption = value; OnPropertyChanged("Caption"); } } } }