WPF: ContextMenu MenuItem из DataContext/ItemsSource?

Я создаю простое приложение для хранения телевизионных шоу. У меня есть класс Video для шоу с некоторыми полями и свойствами, включая одну ссылку на объект типа VideoSeason, представляющий сезоны телешоу. Соответствующий элемент пользовательского интерфейса объекта Video является Button с ContextMenu с некоторыми действиями.

Я хотел бы создать MenuItem внутри ContextMenu, который содержит все сезоны, добавленные к телешоу, представленному в виде подменю. Я знаю, что для этого я должен отметить ObservableCollection Сезоны как ItemsSource из MenuItem Сезоны и указывают, что любой подменю внутри MenuItem связан с собственностью SeasonNumber внутри VideoSeason.

Моя проблема в том, что я действительно не знаю, как связать эти подменюитемы в XAML, если это действительно возможно. Я уже пробовал некоторые параметры (например, шаблон элемента WPF ContextMenu, элемент menu внутри элемента menu или привязка элемента меню WPF ContextMenu MenuItem к свойству UserControl против свойства ViewModel), но я хочу только свой MenuItem быть связанным, а не весь CntextMenu,

Вот соответствующая часть видео класса:

    public string Name { get; set; }       
    public int NextEpisode { get; set; }
    public ObservableCollection<VideoSeason> Seasons { get; set; }

А вот соответствующая часть кода XAML:

       <ScrollViewer>
        <StackPanel Name="filmHolder" 
          Grid.Row="1" Grid.Column="0" >
            <ItemsControl Name="VideoUIElment">
                <ItemsControl.ItemTemplate>
                    <DataTemplate x:Uid="videoTemplate">
                        <Border CornerRadius="10" Padding="10, 10" Background="Silver">
                          <Button Name="filmLabel" Content="{Binding Name}"  FontSize="30" Foreground="Black" VerticalAlignment="Center" HorizontalAlignment="Center"
                              Click="FilmLabel_Click" BorderThickness="0">
                                <Button.ContextMenu>
                                    <ContextMenu Name="LocalMenu">
                                        <MenuItem Header="Rename"/>
                                        <MenuItem Header="Delete"/>
                                        <MenuItem Header="Add New Season" Name="NewSeason" Click="NewSeason_Click"/>
                                        <MenuItem Header="Seasons" ItemsSource="{Binding Seasons}">
                                            <!--<MenuItem.ItemTemplate This is one of the things I tried in vain>
                                                    <DataTemplate>
                                                    <MenuItem Header="{Binding SeasonNumber}"/>
                                                    </DataTemplate>
                                            </MenuItem.ItemTemplate>-->
                                        </MenuItem>
                                    </ContextMenu>
                                </Button.ContextMenu>
                            </Button>
                        </Border>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </ScrollViewer>

Как видно, проблемная часть вложена в DataTemplate принадлежность к пользовательскому интерфейсу видео, что может быть причиной проблемы, но я не уверен.

1 ответ

Решение

Если вы связываете ItemsSource собственность ItemsControl для IEnumerable<Video>, это должно работать:

<ItemsControl Name="VideoUIElment" ItemsSource="{Binding Videos}">
    <ItemsControl.ItemTemplate>
        <DataTemplate x:Uid="videoTemplate">
            <Border CornerRadius="10" Padding="10, 10" Background="Silver">
                <Button Name="filmLabel" Content="{Binding Name}"  FontSize="30" Foreground="Black" VerticalAlignment="Center" HorizontalAlignment="Center"
                              Click="FilmLabel_Click" BorderThickness="0">
                    <Button.ContextMenu>
                        <ContextMenu Name="LocalMenu">
                            <MenuItem Header="Rename"/>
                            <MenuItem Header="Delete"/>
                            <MenuItem Header="Add New Season" Name="NewSeason" Click="NewSeason_Click"/>
                            <MenuItem Header="Seasons" ItemsSource="{Binding Seasons}">
                                <MenuItem.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding SeasonNumber}"/>
                                    </DataTemplate>
                                </MenuItem.ItemTemplate>
                            </MenuItem>
                        </ContextMenu>
                    </Button.ContextMenu>
                </Button>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Удостоверься что SeasonNumber является государственной собственностью VideoSeason учебный класс.

Другие вопросы по тегам