Привязка элементов MenuSource к рекурсивной структуре данных - PullRequest
0 голосов
/ 29 октября 2010

У меня есть простая структура данных (свойства, конечно, свойства зависимости):

class MenuData{
    public string Header {get; protected set;}
    public ObservableCollection<MenuData> Items { get; protected set; }
}

ObservableCollection<MenuData> Menus {get; protected set;}

Я хочу связать свойство Menus как элемент Menu ItemsSource. Результат должен выглядеть как стандартная строка меню Windows: элементы первого уровня будут выровнены горизонтально, а скрытые подэлементы - это подменю.

Я экспериментировал с XAML, чтобы создать первый уровень (горизонтальная строка меню):

<my:MenuElement ItemsSource="{Binding Menus}">
    <my:MenuElement.ItemTemplate>
        <DataTemplate>                
            <MenuItem Header="{Binding Header}">                    
                <!-- Try to add some sub-menus to see what it is going to look like. -->
                <MenuItem Header="A" />
                <MenuItem Header="A" />
                <MenuItem Header="A" />
                <MenuItem Header="A" />
            </MenuItem>
        </DataTemplate>
    </my:MenuElement.ItemTemplate>
</my:MenuElement>

Я использовал свою пользовательскую перегрузку MenuItem, потому что ItemTemplate уже обернут в тег MenuItem для элемента Menu, поэтому мне пришлось избавиться от этого:

class MenuElement: System.Windows.Controls.Menu 
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new System.Windows.Controls.ContentPresenter();
    }
}

Но результат выглядит совершенно неверно (обратите внимание, что выделение слишком велико и стрелки подменю)

alt text

Не могли бы вы указать мне правильное направление, чтобы я мог сделать эту работу?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 30 октября 2010

Так что я наконец понял это. Ответ: HierarchicalDataTemplate .

...