2014-04-10 51 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}" /> 
相關問題