0

我遇到了 xaml 问题...我创建的按钮未启用。这是 xaml 部分:

<Button Margin="0,2,2,2" Width="70" Content="Line" 
        Command="{x:Static local:DrawingCanvas.DrawShape}"
        CommandTarget="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
            AncestorType={x:Type Window}}, Path=DrawingTarget}"
        CommandParameter="Line">           
</Button>

在构造函数之前:

    public static RoutedCommand DrawShape = new RoutedCommand();

在 ctor 我有:

this.CommandBindings.Add(new CommandBinding(DrawingCanvas.DrawShape, DrawShape_Executed, DrawShapeCanExecute));

然后我有:

private void DrawShapeCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;  **//Isn't this enough to make it enable?**
    en.Handled = true;

}

private void DrawShape_Executed(object sender, ExecutedRoutedEventArgs e)
{
    switch (e.Parameter.ToString())
    {
        case "Line":
            //some code here (incomplete yet)
            break;
    }

当我删除块中的第一行(Command="{x:Static ...}")时,它会再次启用!

4

1 回答 1

2

确保该CanExecute命令的属性返回 true。如果它返回 false,它会自动禁用使用该命令的控件。

可以执行应该返回一个布尔值,我有点惊讶它没有给出编译错误。无论如何尝试将其更改为此。

private bool DrawShapeCanExecute(object sender, CanExecuteRoutedEventArgs e) 
{
    return true; 
}

编辑:

好的,因为您刚刚透露了您想要的只是一个执行命令的简单按钮,这里是从我最近的一个项目中复制的一个非常简单的实现。首先在某个地方定义这个类。

public class GenericCommand : ICommand
{
    public event EventHandler CanExecuteChanged { add{} remove{} } 

    public Predicate<object> CanExecuteFunc{ get; set; }

    public Action<object> ExecuteFunc{ get; set; }

    public bool CanExecute(object parameter)
    {
        return CanExecuteFunc(parameter);
    }

    public void Execute(object parameter)
    {
        ExecuteFunc(parameter);
    }
}

接下来在您的视图模型中定义一个命令并定义我在通用命令中创建的两个属性(这只是实现 ICommand 接口的基本内容)。

 public GenericCommand MyCommand { get; set; }

 MyCommand = new GenericCommand();
 MyCommand.CanExecuteFunc = obj => true;
 MyCommand.ExecuteFunc = obj => MyMethod;

 private void MyMethod(object parameter)
 {
      //define your command here
 }

然后只需将按钮连接到您的命令。

<Button Command="{Binding MyCommand}" />

如果这对您来说太过分了(MVVM 确实需要一些额外的初始设置)。你总是可以这样做...

<Button Click="MyMethod"/>

private void MyMethod(object sender, RoutedEventArgs e)
{
    //define your method
}
于 2012-10-03T17:56:55.030 回答