WPF:来自 DataContext/ItemsSource 的 ContextMenu MenuItem?

WPF: ContextMenu MenuItem from DataContext/ItemsSource?

我正在构建一个简单的应用程序来存储电视节目。我有一个用于节目的视频 class,其中包含一些字段和属性,包括一个对 VideoSeason 类型对象的引用,代表电视节目的季节。 Video 对象对应的 UI 元素是一个 Button,带有一些动作的 ContextMenu

我想在 ContextMenu 中创建一个 MenuItem,其中包含添加到电视节目中的所有季节,表示为子菜单项。我知道要做到这一点,我必须将 ObservableCollection Seasons 标记为 MenuItem Seasons 的 ItemsSource 并指出 MenuItem 内的任何子菜单项都绑定到 属性 SeasonNumber 在 VideoSeason 里面。

我的问题是我真的不知道如何在 XAML 中绑定这些子菜单项,如果这真的可行的话。我已经尝试了一些选项(例如,, or Binding WPF ContextMenu MenuItem to UserControl Property vs ViewModel Property),但我只想绑定我的 MenuItem,而不是整个 CntextMenu.

这是视频的相关部分class:

    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>

可以看出,有问题的部分嵌套在Video的UI所属的DataTemplate中,可能是问题的原因,但我不确定.

如果将 ItemsControlItemsSource 属性 绑定到 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>

确保 SeasonNumberVideoSeason class 的 public 属性。