Как привязать данные к IGrouping в WPF? - PullRequest
3 голосов
/ 22 марта 2012

Мне трудно заставить это работать, и я безнадежно запутался со всеми шаблонами, которые нужно использовать. Вот ситуация.

Я хочу, чтобы меню создавалось динамически. Код принимает список объектов, групп список, а затем устанавливает источник элементов меню.

navBarControl.NavBarMain.ItemsSource = newActions.GroupBy(Function(p) p.GroupName)

Мне нужна помощь с шаблонами и привязкой данных в XAML. Я хочу создать меню, в котором верхние элементы будут являться ключом группы, а потом дочерние элементы для каждой клавиши будут самими элементами.

А затем мне нужно установить обработчик кликов для каждого потомка, чтобы я мог выполнять код при нажатии на пункт меню.

Это оказывается трудным для меня, чтобы выполнить. Кто-нибудь может предоставить пример XAML о том, как это будет работать?

1 Ответ

2 голосов
/ 22 марта 2012

После некоторых экспериментов и небольшой удачи я наконец нашел решение. Я надеюсь, что это поможет кому-то еще с этой проблемой. Напомним, что я хотел привязать источник данных (сгруппированный), в котором есть дети (возможно, внуки), и динамически создавать меню. Задача состояла в том, чтобы перенаправить ALL события щелчка пункта меню в один обработчик событий. Вот что я придумал.

<!-- Common handler for ALL menu items. This was a tough one to figure out since I kept thinking this had to be done the template somehow -->
    <Menu MenuItem.Click="navView_Click" >
        <Menu.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding}">
                <!-- Content presenter for the list of IGrouping objects. Binding is done to the Key property on the IGrouping class -->
                <ContentPresenter Content="{Binding Path=Key}"></ContentPresenter>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <!-- Content presenter for the list of objects in each grouping. Binding is done to the Name property on the custom class -->
                        <ContentPresenter Content="{Binding Path=Name}"></ContentPresenter>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </Menu.ItemTemplate>
    </Menu> 

А вот источник данных, устанавливаемый в коде. C # и VB соответственно

navBarControl.NavBarMain.ItemsSource = newActions.GroupBy(Function(p) p.GroupName)

navBarControl.NavBarMain.ItemsSource = newActions.GroupBy( p => p.GroupName);
...