WPF:来自DataContext / ItemsSource的ContextMenu MenuItem?

时间:2017-06-26 19:28:45

标签: wpf xaml custom-contextmenu

我正在构建一个简单的App来存储电视节目。我有一个视频类,用于显示一些字段和属性,包括对VideoSeason类型对象的一个​​引用,代表电视节目的季节。 Video对象的相应UI元素是ButtonContextMenu包含一些操作。

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

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

以下是Video类的相关部分:

    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 个答案:

答案 0 :(得分:1)

如果您将ItemsSource的{​​{1}}属性绑定到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类的公共属性。