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