WPF - не показывать контекстное меню, когда ListView пуст - PullRequest
4 голосов
/ 30 июля 2010

У меня привязка ContextMenu к ListView, но я не хочу, чтобы меню отображалось, когда ListView пуст.Я пробовал прямую привязку к элементу, пытался связать с помощью FindAncestor, но ничего из этого не работает, и меню всегда отображается, когда я щелкаю правой кнопкой мыши в 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();
    }                
}

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 31 июля 2010

Используйте свойство ContextMenuService.IsEnabled , чтобы предотвратить отображение ContextMenu. Что-то вроде:

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

с использованием конвертера, который возвращает True или False.

Поскольку привязка теперь находится в самом ListView, вы также можете использовать привязку с RelativeSource of Self вместо необходимости использовать ElementName или привязать напрямую к DataContext, указав путь к Logins.Count (при условии входа в систему). имеет собственное свойство Count).

1 голос
/ 30 июля 2010

Самый простой способ сделать это - прослушать событие ListView ContextMenuOpening. Затем вы можете выполнить любую логику и отменить открытие меню.

0 голосов
/ 30 июля 2010

Спасибо за ответ, извините за мою ошибку, я скопировал неправильный конвертер из буфера обмена здесь. Он возвращал возврат Visibility.Visible или Visibility.Hidden, но это не решило мою проблему.

Странно, что когда я делаю это:

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

Я получаю ContextMenu с пустой строкой, независимо от того, есть ли в ListView элементы или нет! Но в той же форме, когда я делаю это:

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

Я вижу, что содержимое кнопки изменяется правильно в соответствии с количеством элементов ListView! Кажется, что ListView должен иметь другую привязку, FindAncestor с AncestorType = ListView не работает, и у меня нет идей: - (

0 голосов
/ 30 июля 2010

Ваше связывание не будет работать.Свойство Visibility не является логическим, это перечисление.Вы должны использовать встроенный конвертер BooleanToVisibilityConverter.

...