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

时间:2015-04-27 15:09:34

标签: c# wpf listbox contextmenu

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;
}

2 个答案:

答案 0 :(得分:2)

要获得ListBox,您需要引用PlacementTarget的{​​{1}},并且可以通过ContextMenu绑定

来实现
RelativeSource

答案 1 :(得分:0)

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

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