【发布时间】:2020-02-06 20:24:37
【问题描述】:
我有一个基于 MVVM 的 WPF 上下文菜单,并希望将菜单项的可见性绑定到其子菜单项的 IsEnabled 属性。问题是:根MenuItem 始终可见,即使所有子菜单项都被禁用。但是在菜单项上移动光标会使其隐藏,我真的不知道为什么。
这是我的 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)}");
}
}
我希望你们中的一些人可以帮助我找到问题。
非常感谢。
【问题讨论】:
-
如何更改
MenuItem的IsEnabled属性? -
CanExecute 返回值时,由命令绑定改变。这发生在初始化过程中。
-
好的,在你的情况下,我们可以静态地将 IsEnabled 设置为 false 以重现问题吗?
-
移除命令绑定,将所有子菜单项的IsEnabled属性静态设置为false即可。看起来子菜单项的绑定在它们出现之前不会被触及。知道为什么吗?
-
可能是因为 CanExecuteChanged 没有提早提出。尝试手动引发事件?