gpt4 book ai didi

c# - MenuItem 可见性基于子菜单项状态

转载 作者:行者123 更新时间:2023-12-03 11:01:40 25 4
gpt4 key购买 nike

我有一个基于 MVVM 的 WPF 上下文菜单,并希望将菜单项的可见性绑定(bind)到 IsEnabled其子菜单项的属性。问题是:根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)}");
}
}

我希望你们中的一些人可以帮助我找到问题。

非常感谢。

最佳答案

似乎 ItemsPopupPopup 之前不会评估他们的绑定(bind)调用IsSubmenuOpenChanged回调和调用 CommandManager.InvalidateRequerySuggested()IsSubmenuOpen 之后属性已更改 (Source)。

所以我最终得到了另一个根命令MenuItem验证所有子菜单命令的 CanExecute。

关于c# - MenuItem 可见性基于子菜单项状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60090543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com