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

編集:

わかりました。必要なのはコマンドを実行する単純なボタンだけです。これは、最近のプロジェクトの1つからコピーした非常に単純な実装です。まず、このクラスをどこかに定義します。

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 に答える