How do I dynamically bind and statically add MenuItems?
You can use a CompositeCollection
to do this, you can combine different Collections and add static items in the xaml.
Example:
Xaml:
<Window x:Class="WpfApplication8.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="233" Width="143" Name="UI"> <Window.Resources> <CollectionViewSource Source="{Binding ElementName=UI, Path=Windows}" x:Key="YourMenuItems"/> </Window.Resources> <Grid DataContext="{Binding ElementName=UI}"> <Menu Height="24" VerticalAlignment="Top"> <MenuItem Header="_View" > <MenuItem Header="Windows"> <MenuItem.ItemsSource> <CompositeCollection> <CollectionContainer Collection="{Binding Source={StaticResource YourMenuItems}}" /> <MenuItem Header="Menu Item 1" /> <MenuItem Header="Menu Item 2" /> <MenuItem Header="Menu Item 3" /> </CompositeCollection> </MenuItem.ItemsSource> <MenuItem.ItemContainerStyle> <Style> <Setter Property="MenuItem.Header" Value="{Binding Title}"/> </Style> </MenuItem.ItemContainerStyle> </MenuItem> </MenuItem> </Menu> </Grid></Window>
Code
public partial class MainWindow : Window{ private ObservableCollection<MyObject> _windows = new ObservableCollection<MyObject>(); public MainWindow() { InitializeComponent(); Windows.Add(new MyObject { Title = "Collection Item 1" }); Windows.Add(new MyObject { Title = "Collection Item 2" }); } public ObservableCollection<MyObject> Windows { get { return _windows; } set { _windows = value; } }}public class MyObject{ public string Title { get; set; }}
Result: