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
учебный класс.