【发布时间】:2015-10-12 18:37:39
【问题描述】:
我在做一些看起来很容易但实际上并不容易的事情时遇到了麻烦。
我有一个 ListView,我在其中绑定了一个 ObservableCollection,我希望在右键单击该 ListView 的一个元素时出现一个 ContextMenu。
在那个 ContextMenu 中,我想要一个显示“添加到播放列表”的 MenuItem,其中包含我所有播放列表的列表。
所以我这样做了,这对我来说是正确的:
<ListView Grid.Row="0" Grid.Column="1" x:Name="ListBoxSelectedFolder" ItemsSource="{Binding Path=SelectedFolder.PlayableElements}">
<ListView.Resources>
<ContextMenu x:Key="ContextMenu">
<MenuItem Header="Add to" ItemsSource="{Binding Path=Playlists}">
<MenuItem Header="{Binding Name}"/>
</MenuItem>
<MenuItem Header="Remove from All" />
</ContextMenu>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource ContextMenu}"/>
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="Type" DisplayMemberBinding="{Binding Extension}" />
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
</GridView>
</ListView.View>
</ListView>
问题是我在子菜单中唯一得到的是我单击的项目的名称:不知何故,它与 ListView 的集合 SelectedFolder.PlayableElements 绑定,因为 SelectedFolder.PlayableElements 和播放列表都有一个名称财产。
所以这两个绑定之间存在某种冲突,我不知道如何解决它。
提前感谢您的回复。
【问题讨论】:
-
<MenuItem Header="Add to" ItemsSource="{Binding Path=Playlists}"><MenuItem Header="{Binding Name}"/></MenuItem>- 这意味着您同时设置了ItemsSource并将项目添加到父MenuItem 的Items,这应该会在运行时引发一些异常。 -
它不会抛出异常供您查看,因为
Binding静默失败。ContextMenu与可视化树分离,因此您需要以某种方式显式设置绑定源。 -
@KingKing 我该怎么做?
-
不清楚您的
Playlists来自哪里?比如来自ListView的DataContext或一些显式的子视图模型? -
@KingKing 其实这是我的 MainWindow 类的一个属性
标签: c# wpf data-binding