wpf命令控制可见性

时间:2012-06-08 21:20:16

标签: 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 ; } }
}

我注册了这样的绑定

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

并使用转换器将bool值转换为callpsed或visible

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
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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