Use the MVVM path when your ribbon needs to react to application state or dynamic feature flags.
<ribbon:Ribbon TabsSource="{CompiledBinding Ribbon.Tabs}"
CommandCatalog="{CompiledBinding CommandCatalog}"
StateStore="{CompiledBinding StateStore}"
SelectedTabId="{CompiledBinding Ribbon.SelectedTabId, Mode=TwoWay}"
IsMinimized="{CompiledBinding Ribbon.IsMinimized, Mode=TwoWay}"
IsKeyTipMode="{CompiledBinding Ribbon.IsKeyTipMode, Mode=TwoWay}"
QuickAccessItems="{CompiledBinding QuickAccessItems}"
QuickAccessPlacement="{CompiledBinding QuickAccessPlacement, Mode=TwoWay}" />
Typical runtime setup:
var commandCatalog = new DictionaryRibbonCommandCatalog();
var stateStore = new JsonRibbonStateStore("ribbon-state.json");
var ribbon = new RibbonViewModel();
var homeTab = new RibbonTabViewModel { Id = "home", Header = "Home" };
var clipboardGroup = new RibbonGroupViewModel { Id = "clipboard", Header = "Clipboard" };
clipboardGroup.ItemsViewModel.Add(new RibbonItemViewModel
{
Id = "paste",
Label = "Paste",
CommandId = "paste",
});
homeTab.GroupsViewModel.Add(clipboardGroup);
ribbon.Tabs.Add(homeTab);
This mode keeps the view passive while letting you unit-test the ribbon composition logic independently of Avalonia visuals.