如何在 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
,您需要参考 ContextMenu
的 PlacementTarget
,您可以通过 RelativeSource
绑定
来实现
<MenuItem ...
IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItems, Converter={StaticResource HasItems}}"/>
当 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
,您需要参考 ContextMenu
的 PlacementTarget
,您可以通过 RelativeSource
绑定
<MenuItem ...
IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItems, Converter={StaticResource HasItems}}"/>