Search code examples
c#wpfvisual-studio-2013menuitemitemssource

Dynamic MenuItems with ItemsSource in xaml?


I'm crap atn english, so sorry..

I'm trying to create dynamic menu items that display something based on a collection (a list of object), here is my xaml, you can see the "ListBox" and the "MenuItem".

As I said, I'm binding the header to the "name" of my object :

MainWindow.xaml

<Grid Margin="0,0,-8,-9" Background="Black" >

    <DockPanel x:Name="LayoutRoot">
        <Grid VerticalAlignment="Top">
            <MediaElement x:Name="mediaElement" HorizontalAlignment="Center"  Margin="0,0,60,30" VerticalAlignment="Top" MouseLeftButtonUp="mediaElement_MouseLeftButtonUp">

            </MediaElement>
            <Menu HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="525" IsMainMenu="True">
                <MenuItem Header="Menu">
                    <ListBox x:Name="myList" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="461,-261,-1,106" Background="#FFFFE800" MouseDoubleClick="ListBox_Double_Click" Width="57">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>

                                    <MenuItem Header="{Binding name}"> </MenuItem>

                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </MenuItem>
            </Menu>
        </Grid>

Here is my code in the c#, as you can see I bind "myList" (which is my ListBox) with the ItemsGetSource of list (which contains the things I want to display in my menu):

public MainWindow()
{
    var list = new List<History>
    {
        new History() { name = "Guy1"},
        new History() { name = "Guy2"},
        new History() { name = "Guy3"},
        new History() { name = "Guy4"},
    };

    InitializeComponent();

    this.myList.ItemsSource = list;
}

And my class "History" (the "name" field is what I want to display)

namespace MediaPlayer
{
    public class History
    {
        // "prop" puis "tab"
        public String name { get; set; }
        public String path { get; set; }
        public int time { get; set; }

        public override string ToString()
        {
            return name;
        }
    }
}

I think I can't use itemSource for my menuItems, maybe?


Solution

  • Here is an example that only uses MenuItems:

    MainWindow.xaml

    <Grid Margin="0,0,-8,-9" Background="Black" >
        <DockPanel x:Name="LayoutRoot">
            <Grid VerticalAlignment="Top">
                <MediaElement x:Name="mediaElement" HorizontalAlignment="Center"  Margin="0,0,60,30" VerticalAlignment="Top" MouseLeftButtonUp="mediaElement_MouseLeftButtonUp">
    
                </MediaElement>
                <Menu HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="525" IsMainMenu="True">
                    <MenuItem Header="Menu" x:Name="myList">
                        <MenuItem.ItemContainerStyle>
                            <Style>
                                <Setter Property="MenuItem.Header" Value="{Binding name}"/>
                            </Style>
                        </MenuItem.ItemContainerStyle>
                    </MenuItem>
                </Menu>
            </Grid>
        </DockPanel>
    </Grid>
    

    The result looks like this:

    enter image description here