在WPF中使用嵌套ItemsControl的汉堡菜单?

时间:2016-08-24 14:50:18

标签: c# wpf xaml model controls

我正在使用WPF在C#/ XAML中实现一个汉堡包菜单,我不确定我的方式是否正确。

最终目标是拥有父项列表,每个项都可以包含子项列表。 这将位于屏幕左侧的垂直菜单控件中。例如:

Parent 1
    Child 1
Parent 2
    Child 1
    Child 2
    Child 3

现在我有以下内容:

<Grid>
    <ItemsControl DataContext="{Binding HamburgerModel}" ItemsSource="{Binding HamburgerModel.ParentItems}" Foreground="White" Background="Red" HorizontalAlignment="Left" Width="75" MouseDown="ItemsControl_MouseDown">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <GroupBox Header="{Binding Text}">
                    <ItemsControl ItemsSource="{Binding ParentItems.ChildItems}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Text}" />
                                </StackPanel>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </GroupBox>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

我的模型看起来像这样:

public class HamburgerMenuModel
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }

    public ObservableCollection<ParentItem> ParentItems { get; set; }
}

public class ParentItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }

    public string Text { get; set; }
    public string URL { get; set; }
    public ObservableCollection<ChildItem> ChildItems { get; set; }
}

public class ChildItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }

    public string Text { get; set; }
    public string URL { get; set; }
    public long Offset { get; set; }
}

我的问题是,这种做法有意义吗?有没有明显的错误或缺陷? 任何关于下一个方向的指针都是最有帮助的。

0 个答案:

没有答案