Чтобы сделать это правильно для MVVM , вам нужно определить собственный интерфейс элементов (например, IMenuItem ), создать производные классы для Меню / ContextMenu и для MenuItem , в этих классах переопределяют следующие виртуальные защищенные методы:
ItemsControl.PrepareContainerForItemOverride
ItemsControl.ClearContainerForItemOverride
ItemsControl.GetContainerForItemOverride
ItemsControl.IsItemItsOwnContainerOverride
Убедитесь, что этот метод создан для элементов типа IMenuItem контейнеров вашего нового производного от MenuItem типа с привязкой всех необходимых свойств, здесь вы можете различать разные типы IMenuItem , чтобы показать нормальные элементы, разделитель или некоторые другие. Для неизвестных типов вызовите базовую реализацию.
Теперь, если вы свяжете ItemsSource свойство вашего нового, полученного из Меню / ContextMenu control с набором IMenuItem , он покажет вам ожидаемый результат без необходимости теперь View-вещи на стороне ViewModel.