C# 为什么可以';t我使用“;HasItems";属性与ItemsSource在ContextMenu上?
我正在使用DataGrid上的上下文菜单 我希望每个项目将显示右键单击的实体的上下文菜单项。 如果没有实体,则上下文菜单项列表将为空,因此在这种情况下,我不希望具有空项的用户可以看到上下文菜单。(我在空矩形上看到,这会让用户感到困惑) 我的代码如下所示:C# 为什么可以';t我使用“;HasItems";属性与ItemsSource在ContextMenu上?,c#,wpf,xaml,triggers,contextmenu,C#,Wpf,Xaml,Triggers,Contextmenu,我正在使用DataGrid上的上下文菜单 我希望每个项目将显示右键单击的实体的上下文菜单项。 如果没有实体,则上下文菜单项列表将为空,因此在这种情况下,我不希望具有空项的用户可以看到上下文菜单。(我在空矩形上看到,这会让用户感到困惑) 我的代码如下所示: <ContextMenu Name="cm" ItemsSource="{Binding DemoInstance.ContextMenuItems}" ItemCon
<ContextMenu Name="cm" ItemsSource="{Binding DemoInstance.ContextMenuItems}"
ItemContainerStyle="{StaticResource demo2Style}" >
<Style TargetType="{x:Type ContextMenu}">
<Style.Triggers>
<Trigger Property="HasItems" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</ContextMenu>
当我使用它时,我得到一个例外:
“类型为'System.InvalidOperationException'的未处理异常”
发生在PresentationFramework.dll中
其他信息:项集合在使用之前必须为空
项目来源。“
发生这种情况的原因以及我如何解决它?问题在于您的XAML。您添加了一个
样式
,作为上下文菜单
的子级,并且还绑定了它的项资源
属性。(无法同时设置这两个选项。有关详细信息,请参阅。)
但从您的代码中,我怀疑您很可能想要这样的东西:
<ContextMenu Name="cm" ItemsSource="{Binding DemoInstance.ContextMenuItems}"
ItemContainerStyle="{StaticResource demo2Style}" >
<Style TargetType="{x:Type ContextMenu}">
<Style.Triggers>
<Trigger Property="HasItems" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</ContextMenu>
资源部分(您的demo2Style
所在的位置):
将
上下文菜单
样式放置在
标记下:
<ContextMenu Name="cm" ItemsSource="{Binding DemoInstance.ContextMenuItems}"
ItemContainerStyle="{StaticResource demo2Style}" >
<ContextMenu.Style>
<Style TargetType="{x:Type ContextMenu}">
<Style.Triggers>
<Trigger Property="HasItems" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</ContextMenu.Style>
</ContextMenu>
样式中的targetType不是说它将应用于所有ContextMenu吗?我们必须明确地将它包含在ContextMenu.Style中吗?是的,它会的。但问题是OP在ContextMenu下添加了样式。理想情况下,样式应该位于父元素或根元素资源部分,以便显式地应用于所有子上下文菜单。然后我会建议删除TargetType,因为在这种情况下它是不必要的,它欺骗了像我和OP这样的一些人,他们认为它会应用于每个上下文菜单。TargetType
与应用于所有上下文菜单无关。如果省略设置x:Key
,则它将应用于所有子上下文菜单。如果不设置TargetType
,则必须使用完全限定的属性名,否则XAML编译器会抱怨找不到可见性属性。现在我明白了。OP所做的是在ContextMenu中定义一个对象,而不是使用该样式告诉ContextMenu。我学到了一些新东西。非常感谢。
<ContextMenu Name="cm" ItemsSource="{Binding DemoInstance.ContextMenuItems}"
ItemContainerStyle="{StaticResource demo2Style}" >
<ContextMenu.Style>
<Style TargetType="{x:Type ContextMenu}">
<Style.Triggers>
<Trigger Property="HasItems" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</ContextMenu.Style>
</ContextMenu>