即使在WPF提供CommandParameter按钮后未启用(Button not enabled

2019-09-21 14:14发布

我创建了一个按钮使用实现ICommand接口一个类,其commandparameter被设置和命令。 但我的按钮是无效的。 这是为什么? 我从这里验证码的ICommand就像一个巧克力蛋糕

<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());
    }
}

Answer 1:

那么,这是非常,非常简单的实现的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工作的,你可以阅读这个由约什-史密斯很好的文章。



Answer 2:

最简单的答案 - 切换命令和命令参数的地方:

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

但更好的是@Dennis给出



Answer 3:

在我的情况下,它是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>

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

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

希望这可以帮助别人的道路。



文章来源: Button not enabled even after providing CommandParameter in WPF