为什么我不能使用" HasItems" ContextMenu上有ItemsSource的属性?

时间:2014-04-10 17:12:54

标签: c# wpf xaml triggers contextmenu

我在DataGrid上使用上下文菜单 我希望每个项目都会显示右键单击的实体的上下文菜单项。 在没有实体的情况下,上下文菜单项列表将为空,因此在这种情况下,我不希望具有空项的用户可以看到上下文菜单。 (我在空矩形上看到会让用户感到困惑)。

我的代码如下:

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

当我使用它时,我得到例外:

“PresentationFramework.dll中发生了'System.InvalidOperationException'类型的未处理异常

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

为什么会这样,我该如何解决?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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}" />