2014-04-10 45 views
1

我在DataGrid上使用上下文菜单。
我希望每个项目都会显示右键单击的实体的上下文菜单项。 如果没有实体,则上下文菜单项列表将为空,因此在这种情况下,我不希望上下文菜单对于具有空项目的用户可见。 (我看到空矩形会混淆用户)。为什么我不能在ContextMenu和ItemsSource上使用“HasItems”属性?

我的代码如下所示:

<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

附加信息:在使用ItemsSource之前,项目集合必须为空。“

为什么会发生这种情况,我该如何解决它?

回答

3

广场ContextMenu<ContextMenu.Style>标签的样式:

<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> 
+0

不风格的TARGETTYPE说,这将适用于所有文本菜单?我们是否必须明确地将它包含在ContextMenu.Style中? – LxL

+1

是的。但问题是OP在ContextMenu下添加了样式。理想的样式应该驻留在父元素或根元素资源部分,以便它明确地应用于所有子上下文菜单。 –

+0

现在我明白了。然后我建议删除TargetType,因为在这种情况下它不是必要的,它会欺骗像我这样的人和OP认为它适用于每个ContextMenu。 – LxL

0

问题在于您的XAML。您添加了Style作为ContextMenu的子项,并绑定了它的ItemsSource属性。 (如果二者是不可能看到here获取更多信息。)

但是从你的代码,我怀疑你很有可能想是这样的:

资源的一部分(在您demo2Style所在):

<Style x:Key="myCustomStyle" TargetType="{x:Type ContextMenu}"> 
    <Style.Triggers> 
     <Trigger Property="HasItems" Value="False"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

而且ContextMenu

<ContextMenu Name="cm" 
       ItemsSource="{Binding DemoInstance.ContextMenuItems}" 
       ItemContainerStyle="{StaticResource demo2Style}" 
       Style="{StaticResource myCustomStyle}" /> 
相关问题