How do I dynamically bind and statically add MenuItems? How do I dynamically bind and statically add MenuItems? wpf wpf

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:

enter image description here