如何在 ListBox 中启用或禁用基于 SelectedItems 的菜单项

How to enable or disable menu items based on SelectedItems in ListBox

ContextMenu 本身定义在 ListBox 中时,有没有办法做到这一点?

我的 ListBox 设置如下:

<ListBox Name="lbxFoundFiles" Margin="10,115,10,5" SelectionMode="Multiple"
            VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
            ItemsSource="{Binding FoundFilesInfo}" ItemTemplate="{DynamicResource FoundFilesListItem}">
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Name="cmiCopyClipboard" Header="Copy file to clipboard" Click="cmiCopyClipboard_Click"
                        IsEnabled="{Binding ElementName=lbxFoundFiles, Path=SelectedItems.Count}"/>
        </ContextMenu>
    </ListBox.ContextMenu>
</ListBox>

但是错误消息对此很清楚(尽管 IntelliSense 知道我在找什么):

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=lbxFoundFiles'. BindingExpression:Path=SelectedItems; DataItem=null; target element is 'MenuItem' (Name='cmiCopyClipboard'); target property is 'IsEnabled' (type 'Boolean')

我看过有关如何在 ListBox 外部定义 ContextMenu 时执行此操作的示例,但我需要它才能工作,以便我可以为我的所有列表框定义一个静态模板。

更新

我为此准备了一个转换器,但我了解到我原来的方法也应该有效。

<MenuItem Name="cmiCopyClipboard" Header="Copy file to clipboard" Click="cmiCopyClipboard_Click"
                            IsEnabled="{Binding ElementName=lbxFoundFiles, Path=SelectedItems, Converter={StaticResource HasItems}}"/>

和转换器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return ((IList<FileInformation>)value).Count > 0;
}

上次我不得不这样做时,我参考了以下文章:

http://www.codeproject.com/Articles/80632/WPF-Context-Menu-on-List-Item

要获得 ListBox,您需要参考 ContextMenuPlacementTarget,您可以通过 RelativeSource 绑定

来实现
<MenuItem ... 
    IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItems, Converter={StaticResource HasItems}}"/>