在xaml中禁用按钮

时间:2012-10-03 17:55:23

标签: c# wpf xaml

我遇到了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 ...}")时,它会再次启用!

1 个答案:

答案 0 :(得分:2)

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

可以执行应该返回一个bool,我有点惊讶,不会给出编译错误。无论如何试着改变它。

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
}