即使在WPF中提供CommandParameter后,按钮仍未启用

时间:2012-08-24 06:34:01

标签: c# .net wpf icommand

我创建了一个按钮,其命令参数设置和命令使用实现ICommand接口的类。但是我的按钮被禁用了。这是为什么?我从这里得到了这段代码:ICommand is like a chocolate cake

<Window x:Class="ICommand_Implementation_CSharp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ICommand_Implementation_CSharp"
    Title="MainWindow" Height="350" Width="525">
<Grid>      
    <Grid>
        <Grid.Resources>
            <local:HelloWorldCommand x:Key="hwc"  />
        </Grid.Resources>

        <Button Command="{StaticResource hwc}" CommandParameter="Hello" 
                Height="23" HorizontalAlignment="Left" Margin="212,138,0,0" 
                Name="Button1" VerticalAlignment="Top" Width="75">Button</Button>
    </Grid>
</Grid>

我的班级是

class HelloWorldCommand:ICommand
{
    public bool CanExecute(object parameter)
    {
        return parameter != null;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        MessageBox.Show(parameter.ToString());
    }
}

3 个答案:

答案 0 :(得分:5)

最简单的答案 - 切换命令和命令参数的位置:

<Button CommandParameter="Hello" Command="{StaticResource hwc}" .../>

但是@Dennis给出了更好的一个

答案 1 :(得分:5)

嗯,这是ICommand非常简单的实现。

正如@JleruOHeP所说,部分问题可以通过交换CommandCommandParameter的设置者来解决。但这很丑陋,因为你每次都要记住这个序列。

更正确的方法是告诉CommandManager重新查询命令状态:

public class HelloWorldCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        return parameter != null;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        MessageBox.Show(parameter.ToString());
    }
}

现在,制定者的顺序是无关紧要的 要了解CommandManager的工作原理,您可以阅读Josh Smith撰写的this好文章。

答案 2 :(得分:0)

在我的情况下,导致问题的是CommandParameter类型。我的按钮就像这样绑定:

<Button Content="New" Command="{Binding NewCommand}" CommandParameter="False" />

基础NewCommandRelayCommand<bool>。不知何故,XAML无法将False翻译为bool。 (请注意,它适用于许多内置类型和属性;可能有一些TypeConverter或其中的某些操作)。

解决方案是简单地向XAML提供有关CommandParameter真正基础类型的信息,如下所示:

<Button Content="New" Command="{Binding NewCommand}">
    <Button.CommandParameter>
        <sys:Boolean>
          False
        </sys:Boolean>
    </Button.CommandParameter>
</Button>

您必须在XAML文件的顶部导入sys命名空间,如下所示:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

希望这可以帮助有人在路上。