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
中,可能是问题的原因,但我不确定.
如果将 ItemsControl
的 ItemsSource
属性 绑定到 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
class 的 public 属性。
我正在构建一个简单的应用程序来存储电视节目。我有一个用于节目的视频 class,其中包含一些字段和属性,包括一个对 VideoSeason 类型对象的引用,代表电视节目的季节。 Video 对象对应的 UI 元素是一个 Button
,带有一些动作的 ContextMenu
。
我想在 ContextMenu
中创建一个 MenuItem
,其中包含添加到电视节目中的所有季节,表示为子菜单项。我知道要做到这一点,我必须将 ObservableCollection
Seasons 标记为 MenuItem
Seasons 的 ItemsSource
并指出 MenuItem
内的任何子菜单项都绑定到 属性 SeasonNumber
在 VideoSeason 里面。
我的问题是我真的不知道如何在 XAML 中绑定这些子菜单项,如果这真的可行的话。我已经尝试了一些选项(例如,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
中,可能是问题的原因,但我不确定.
如果将 ItemsControl
的 ItemsSource
属性 绑定到 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
class 的 public 属性。