5

我创建了一个按钮,其命令参数已设置并使用实现 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());
    }
}
4

3 回答 3

7

嗯,这是非常非常简单的ICommand.

正如@JleruOHeP 所说,部分问题可以通过交换Commandand的设置器来解决CommandParameter。但这是一种丑陋的方式,因为您每次都必须记住顺序。

更正确的方法是告诉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 的这篇精彩文章。

于 2012-08-24T06:52:10.490 回答
5

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

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

但更好的是@Dennis

于 2012-08-24T06:42:13.273 回答
0

就我而言,CommandParameter这是导致问题的类型。我的按钮就像这样简单地绑定:

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

底层证券NewCommand是一个RelayCommand<bool>。不知何故,XAML 无法转换False为 bool。(请注意,它确实适用于许多内置类型和属性;可能有一些TypeConverter或一些在那里起作用)。

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

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

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

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

希望这对未来的人有所帮助。

于 2016-08-16T08:07:28.863 回答