В WPF панель инструментов является ItemsControl (то же самое для Menu ), поэтому она имеет свойство ItemsSource, которое можно привязать к своей коллекции элементов панели инструментов.
<Window.Resources>
<DataTemplate x:Key="ItemTemplate1">
<StackPanel>
<TextBlock Text="{Binding Property1}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding MyViewModel}">
<ToolBar HorizontalAlignment="Left" VerticalAlignment="Top" ItemTemplate="{DynamicResource ItemTemplate1}" ItemsSource="{Binding ToolbarItems}"/>
</Grid>
В этом коде ToolbarItems является коллекцией ObservableCollection , где MyToolbarItem является моделью представления, которая представляет один элемент панели инструментов.
MyToolBarItem может быть базовым классом, унаследованным от него несколькими классами. Затем вы можете использовать DataTemplateSelector , чтобы использовать другой шаблон в зависимости от типа элемента панели инструментов.
Таким образом, все ваши пользовательские элементы управления, имеющие панель инструментов, могут использовать те же шаблоны, которые вы определили в своем словаре; каждая панель инструментов просто связана с другой коллекцией MyToolBarItems.
Если что-то звучит ошеломляюще, вы можете прочитать о MVVM . Именно шаблон дизайна делает WPF великолепным.