WPF 命令控制可见性

本文关键字:可见性 控制 命令 WPF | 更新日期: 2023-09-27 18:36:48

我有一个自定义命令:

public static class CommandLibrary
{
    private static RoutedUICommand cmdMyCommand = new RoutedUICommand("My command", "MyCommand", typeof(CommandLibrary));
    public static RoutedUICommand MyCommand{ get { return cmdMyCommand ; } }
}

我注册了这样的绑定

CommandManager.RegisterClassCommandBinding(typeof(SomeClass), new CommandBinding(CommandLibrary.MyCommand, new ExecutedRoutedEventHandler(myCommandExecuteHandler), new CanExecuteRoutedEventHandler(myCommandCanExecuteHandler)));

在generic.xaml中,我有一个设置了命令属性的Buton。该按钮正在根据 myCommandCanExecuteHandler 中的逻辑正确启用/禁用。

但是现在我还想控制此按钮的可见性(独立于映射到IsEnabled的CanExecute)。我该如何处理这个问题?

关于同一问题的讨论可以在这里找到:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c20782f8-2d04-49d3-b822-f77b4b87c27a/,但不知何故,CanBeSeen是RoutedUICommand派生类的属性的想法对我没有吸引力。

WPF 命令控制可见性

可以将 XAML 中的可见性属性绑定到决定按钮可见性的值

<Button Content="Button" Height="23" Visibility="{Binding someclass, Converter={Binding VisibitlityConverter}}"/>

并使用转换器将布尔值转换为调用或可见

class visibilityConverter : IValueConverter
{
    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (bool)value == true? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    #endregion
}

是否要在启用/禁用按钮时使按钮可见...如果那时您必须使用布尔到可见性转换器将 IsEnabled 属性绑定到可见性属性...

我今天遇到了一个非常相似的问题。

"有时",当可见性转换器将按钮的可见性设置为折叠状态时,将忽略 CanExecute 绑定。我说"有时"是因为,如果我在可见性转换器中放置断点,它会改变行为。

当可见性更改为可见时 - 不会再次调用 CanExecute。在 UI 上的任意位置单击鼠标将刷新 CanExecute 绑定,使其按预期工作。

我通过将 Button IsEnabled 属性直接绑定到我的视图模型上的属性来解决此问题,该属性反映了我的 CanExecute 的功能。