Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';t我使用“;HasItems";属性与ItemsSource在ContextMenu上?_C#_Wpf_Xaml_Triggers_Contextmenu - Fatal编程技术网

C# 为什么可以';t我使用“;HasItems";属性与ItemsSource在ContextMenu上?

C# 为什么可以';t我使用“;HasItems";属性与ItemsSource在ContextMenu上?,c#,wpf,xaml,triggers,contextmenu,C#,Wpf,Xaml,Triggers,Contextmenu,我正在使用DataGrid上的上下文菜单 我希望每个项目将显示右键单击的实体的上下文菜单项。 如果没有实体,则上下文菜单项列表将为空,因此在这种情况下,我不希望具有空项的用户可以看到上下文菜单。(我在空矩形上看到,这会让用户感到困惑) 我的代码如下所示: <ContextMenu Name="cm" ItemsSource="{Binding DemoInstance.ContextMenuItems}" ItemCon

我正在使用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>

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

“类型为'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>