Видимость MenuItem в зависимости от состояния элемента подменю - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть контекстное меню WPF на основе MVVM, и я хочу связать видимость элемента меню со свойством IsEnabled его пунктов подменю. Проблема в том, что root MenuItem всегда виден, даже когда все дочерние пункты меню отключены. Но перемещение курсора по пункту меню скрывает его, и я действительно понятия не имею, почему.

Visualization of the problem

Вот мой код xaml:

<MenuItem x:Name="SelectionMenuItem" Header="{x:Static language:CommonRes.Selection}">
    <MenuItem.Visibility>
        <MultiBinding Converter="{StaticResource AnyBoolToVisibilityConverter}">
            <Binding
                ElementName="SelectGroupMenuItem"
                Mode="OneWay"
                Path="IsEnabled" />
            <Binding
                ElementName="SelectGraphMenuItem"
                Mode="OneWay"
                Path="IsEnabled" />
        </MultiBinding>
    </MenuItem.Visibility>

    <MenuItem
        x:Name="SelectGroupMenuItem"
        Command="{Binding SelectGroupCommand}"
        Header="{x:Static language:CommonRes.Group}"
        Visibility="{Binding IsEnabled, Converter={StaticResource BoolToVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
    <MenuItem
        x:Name="SelectGraphMenuItem"
        Command="{Binding SelectGraphCommand}"
        Header="{x:Static language:CommonRes.ObjectGraph}"
        Visibility="{Binding IsEnabled, Converter={StaticResource BoolToVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
</MenuItem>

и код моего конвертера

public class AnyBoolToVisibilityConverter : IMultiValueConverter
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="values"></param>
    /// <param name="targetType"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns></returns>
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if(!values.All(val => val is bool))
            return Visibility.Collapsed;

        return values.Any(val => (bool)val) ? Visibility.Visible : Visibility.Collapsed;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="value"></param>
    /// <param name="targetTypes"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns></returns>
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException($"ConvertBack not Supported for {nameof(AnyBoolToVisibilityConverter)}");
    }
}

Я надеюсь, что некоторые из вас могут помочь мне найти проблему.

Большое спасибо.

1 Ответ

2 голосов
/ 06 февраля 2020

Кажется, что Items из Popup не будет оценивать свои Привязки, пока Popup не вызовет обратный вызов IsSubmenuOpenChanged и не вызовет CommandManager.InvalidateRequerySuggested() после изменения свойства IsSubmenuOpen ( Источник ).

Итак, я закончил с другой Командой для root MenuItem, которая проверяет CanExecute всех команд подменю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...