2

コマンドの操作方法を理解しようとしています。私はコマンドについてたくさん読みましたが、ほとんどの場合、コマンドはMVVMパターン内で使用されていることを知っています。また、RoutedCommandクラスがあることも知っています。これは、開発中の時間を節約するためによく使用されます。

しかし-私は基本を理解したい-そしてまさにそれが問題だ。どうぞ:

私のアプリでは、クラス'MyCommand'を定義しました:

 public class MyCommand :ICommand
{
    public void Execute(object parameter)
    {
        Console.WriteLine("Execute called!");
        CanExecuteChanged(null, null);
    }

    public bool CanExecute(object parameter)
    {
        Console.WriteLine("CanExecute called!");
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

ええと、静的アクセスを取得するために、すべてのアプリケーションコマンド専用のクラスを作成することにしました。

 public static class AppCommands
    {
        private static ICommand anyCommand = new MyCommand();

        public static ICommand AnyCommand
        {
            get { return anyCommand; }
        }
    }

ほぼそこに。次に、メインウィンドウに2つのボタンを配置します。それらの1つは、コマンドに「バインド」されています。

<StackPanel>
    <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
    <Button Content="Button" Height="23" Name="button2" Width="75" Command="{x:Static local:AppCommands.AnyCommand}" CommandParameter="Hello"/>
</StackPanel>

そしてここにMainWindow.csがあります:

public MainWindow()


  {
        InitializeComponent();
        AppCommands.AnyCommand.CanExecuteChanged += MyEventHandler;
    }


    private void button1_Click(object sender, RoutedEventArgs e)
    {
       // Nothing for the moment
    }

    private void MyEventHandler(object sender, EventArgs e)
    {
        Console.WriteLine("MyEventHandler called");
    }

それで、私のプロジェクトを実行しましょう。ご覧のとおり、コンソール出力をいくつか作成しました。button2をクリックすると、出力は次のようになります。

CanExecuteが呼び出されました!呼び出された実行!CanExecuteが呼び出されました!MyEventHandlerは

だから、私の目にはこれが起こるのです:1。)ボタンのコマンドが「アクティブ化」されます。executeメソッドを呼び出す必要があるかどうかを確認するために、CanExecuteメソッドが呼び出されます。2.)CanExecuteメソッドがtrueを返す場合、Executeメソッドが呼び出されます。3.)executeメソッド内で、イベント「CanExecuteChanged」を発生させる必要があることを定義しました。これを呼び出すと、最初に「CanExecute」がチェックされ、次にイベントハンドラーが呼び出されます。

これは私にはわかりません。イベントを呼び出す唯一の方法は、Executeメソッド内です。ただし、Executeメソッドは、CanExecuteをチェックした後、コマンドロジックを介して呼び出されます。イベントを呼び出すとCanExecuteもチェックされますが、なぜですか?私は混乱しています。

そして、ボタンを無効にしようとすると、事態はさらに混乱します。たとえば、「CommandParameter」があり、「CanExecute」がこれで機能するようになりました。したがって、メソッドがfalseを返す可能性があります。この場合、ボタンは無効になっています-わかりました。

しかし:どうすればそれを再アクティブ化できますか?すでに知っているように、CanExecuteChangeイベントを発生させることができるのはコマンドクラス内からのみです。つまり、無効化されたボタンをクリックできないため、コマンドはCanExecute(またはExecute)メソッドを呼び出しません。

私には見えない重要なものがあるように思えますが、実際にはそれを見つけることができません。

手伝っていただけませんか?

4

1 に答える 1

5

あなたCanExecuteChangedはによって上げられるべきではありません、それは別の値を返し始めるExecuteときに上げられるべきです。CanExecuteそれがいつであるかは、コマンドクラスによって異なります。最も単純な形式では、プロパティを追加できます。

public class MyCommand : ICommand
{
    bool canExecute;

    public void Execute(object parameter)
    {
        Console.WriteLine("Execute called!");
    }

    public bool CanExecute(object parameter)
    {
        Console.WriteLine("CanExecute called!");
        return CanExecuteResult;
    }

    public event EventHandler CanExecuteChanged;

    public bool CanExecuteResult
    {
        get { return canExecute; }
        set {
            if (canExecute != value)
            {
                canExecute = value;
                var canExecuteChanged = CanExecuteChanged;
                if (canExecuteChanged != null)
                    canExecuteChanged.Invoke(this, EventArgs.Empty);
            }
        }
    }
}
于 2012-05-30T08:18:25.787 に答える