这段XAML(在ListView
的定义中)
<ListView
x:Name="ListViewEpisodes"
Grid.Row="1"
Grid.Column="2"
ItemsSource="{Binding Episodes}">
<ListView.View>
<GridView>
<GridViewColumn Header="Episode Name" Width="Auto" DisplayMemberBinding="{Binding FileName}" />
</GridView>
</ListView.View>
<ListView.ContextMenu>
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}}">
<MenuItem
Header="Delete episode"
Command="w:MainWindow.DeleteEpisode"
<!-- PlacementTarget.SelectedItem not OK according to Resharper -->
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}"/>
</ContextMenu>
</ListView.ContextMenu>
</ListView>
Resharper警告:
Can not resolve property 'SelectedItem' in data context of type 'System.Windows.UIElement'
现在,XAML确实有效,当我右键单击某个项目并执行ContextMenuItem
时,它会使用Episode
的内容填充参数。
为什么Resharper对此并不满意?
答案 0 :(得分:3)
这很容易解释。 PlacementTarget
类型为UIElement
,但没有Tag
成员。 ReSharper尝试查找具有标记名称的成员,但它失败了。
在编译时,ReSharper是对的。 ReSharper不知道运行时的确切类型。
也许您需要将绑定表达式重写为:
<ContextMenu DataContext="{Binding Tag, RelativeSource={RelativeSource Self}}" />
很难准确地说,因为你试图通过这种结合表达来实现目标并不明显。