2010-07-30 69 views
4

我有一個ContextMenu綁定到ListView,但我不想當ListView爲空時顯示的菜單。我嘗試了直接綁定到元素,嘗試使用FindAncestor進行綁定,但是這些都不起作用,並且當我在ListView中單擊鼠標右鍵時總是顯示菜單。 什麼是正確的綁定?WPF - ListView爲空時不顯示上下文菜單

<Grid> 
<ListView x:Name="loginListView" ItemsSource="{Binding Logins}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="140" Header="Login" DisplayMemberBinding="{Binding Login}"/> 
      <GridViewColumn Width="140" Header="Password" DisplayMemberBinding="{Binding Password}" /> 
     </GridView> 
    </ListView.View> 

    <ListView.ContextMenu> 
     <ContextMenu> 
      <MenuItem 
       Header="Delete login" 
       Visibility="{Binding ElementName=loginListView, Path=Items.Count, Converter={StaticResource VisibilityConverter}}"/> 
     </ContextMenu> 
    </ListView.ContextMenu> 
</ListView> 

public class visibilityConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((int)value > 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    }     
} 

提前感謝!

回答

5

使用ContextMenuService.IsEnabled屬性,以防止文本菜單被顯示喜歡的東西。

由於綁定現在在ListView本身上,因此您還可以使用Bin的自我的RelativeSource而不必使用ElementName,或者可以通過將路徑設置爲Logins.Count(假設Logins有自己的路徑)直接綁定到DataContext計數屬性)。

+0

接受作爲答案,這就是我一直在尋找! – 2010-08-01 10:13:16

0

你的約束不會工作。 Visibility屬性不是布爾值,它是一個枚舉。你應該使用內置的轉換器BooleanToVisibilityConverter

0

感謝您的回答,對不起我的錯,我在這裏複製了剪貼板中的錯誤轉換器。 我讓它返回Visibility.Visible或Visibility.Hidden,但它沒有解決我的問題。

奇怪的是,當我這樣做:

<ListView.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="{Binding ElementName=loginListView, Path=Items.Count}"/> 
    </ContextMenu> 
</ListView.ContextMenu> 

我得到一個文本菜單與空字符串,而不管的ListView有項目或不! 但在相同的形式,當我這樣做:

<Button Content="{Binding ElementName=loginListView, Path=Items.Count}" Name="deleteButton" Width="100" Height="30" HorizontalContentAlignment="Center" /> 

我看到按鈕含量的變化正確地根據ListView的項目數!似乎ListView必須有其他綁定,FindAncestor與AncestorType = ListView沒有工作以及我的想法:-(

1

最簡單的方法是聽ListView的ContextMenuOpening事件。使用返回真或假的轉換器

<ListView x:Name="loginListView" ItemsSource="{Binding Logins}" 
    ContextMenuService.IsEnabled="{Binding ElementName=loginListView, 
     Path=Items.Count, Converter={StaticResource VisibilityConverter}}"> 

:然後,您可以執行任何你想要的邏輯和開放取消菜單

+0

感謝您的回答,我知道它可以在代碼中完成,但我想要使用綁定在XAML中完成它。 – 2010-08-01 10:12:46