Pantelis
Pantelis

Reputation: 2060

Data bound ContextMenu

I need to implement a contextMenu bound to a collection returned from a web service. The data returned is a collection of the ContextMenuModel class:

List<ContextMenuItem> menuItems = webService.GetMenuItemsForUser(userID);

public class ContextMenuItem
{        
    public string MainItemName { get; set; }
    public List<ContextSubItem> SubItems { get; set; }

    public ContextMenuItem()
    {
        SubItems = new List<ContextSubItem>();
    }
}

public class ContextSubItem
{
    public int ID { get; set; }
    public string Name { get; set; }
}

How would I bind that class on a ContextMenu? Particularly, how would I bind the subitems to a contextMenu?

EDIT

I've tried the following but the subItems don't expand. If I explicitly set IsSubmenuOpen to the mainItem datatemplate, they are visible, but once closed, they don't show again on a second attempt.

<DataGrid.ContextMenu>
    <ContextMenu ItemsSource="{Binding MenuItems}">
        <ContextMenu.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="{Binding MainItemName}" ItemsSource="{Binding SubItems}" >
                    <MenuItem.ItemTemplate>
                        <DataTemplate>
                            <MenuItem Header="{Binding Name}"/>
                        </DataTemplate>
                    </MenuItem.ItemTemplate>
                </MenuItem>
            </DataTemplate>
        </ContextMenu.ItemTemplate>                                                
    </ContextMenu>
</DataGrid.ContextMenu>

Upvotes: 1

Views: 170

Answers (1)

Rohit Vats
Rohit Vats

Reputation: 81253

Use HierarchicalDataTemplate in case you want nested collection:

<ContextMenu ItemsSource="{Binding MenuItems}">
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubItems}">
            <MenuItem Header="{Binding MainItemName}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <MenuItem Header="{Binding Name}"/>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

Upvotes: 1

Related Questions