C# wpf命令控制可见性

C# wpf命令控制可见性,c#,.net,wpf,xaml,command,C#,.net,Wpf,Xaml,Command,我有一个自定义命令: public static class CommandLibrary { private static RoutedUICommand cmdMyCommand = new RoutedUICommand("My command", "MyCommand", typeof(CommandLibrary)); public static RoutedUICommand MyCommand{ get { return cmdMyCommand ; } } }

我有一个自定义命令:

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中,我有一个设置了Command属性的Buton。根据MyCommand CanExecuteHandler中的逻辑,该按钮已正确启用/禁用

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


这里有关于同一问题的讨论:,但不知何故,我对CanBeSeen是RouteDiCommand派生类的属性的想法不感兴趣。

是否希望在启用/禁用按钮时使按钮可见。。。如果必须使用布尔到可见性转换器将IsEnabled属性绑定到可见性属性…

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

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

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

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

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


我通过将Button IsEnabled属性直接绑定到viewmodel上的属性来解决这个问题,该属性反映了CanExecute的功能。

控制可见性的具体依据是什么?关于命令的可执行性?基于我的自定义逻辑,它不同于命令可执行性逻辑。不,它必须“独立于CanExecute”(如原始问题所示)。在某些情况下,我希望按钮即使被禁用也可见。WPF已经为此提供了一个类(BooleantVisibilityConverter,请参阅)。我不认为那是OP想要的,但是。。。
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
}