13

いくつかの単純なデータバインディングを使用するWindowsPhoneアプリに取り組んでいます。MvvMプログラミング方式をベースにしたアプリを作成しました。現在取り組んでいるアプリはMvvM方式でも動作します。コードをできるだけクリーンに保ちたいので、「ボタンクリックイベント」(通常はコードビハインドページで発生します)をビューモデルまたはメインビューモデルで発生させる方法を探していました。

Icommandインターフェースの簡単な説明が必要なインターネットを検索しました。それが、その方法だと信じているからです。私が見つけた説明の問題は、それらのいくつかがCommandRelay関数を使用するMvvMlightツールキットに基づいていることでした。最初に自分で物事を理解したいので、MvvMライトツールキットを使用したくありません。私が見つけた他のチュートリアルは、あなたに過剰な情報を与える熱狂的な開発者によって書かれました。

ボタンにバインドされたIcommandの最も単純なバージョンが機能することを誰かに見せてもらえますか?

4

2 に答える 2

21

XAML で:

<Button Content="My Button" Command="{Binding MyViewModelCommand}" />

あなたのビューモデルで:

public class MyViewModel
{

    public MyViewModel()
    {
        MyViewModelCommand = new ActionCommand(DoSomething);
    }

    public ICommand MyViewModelCommand { get; private set; }

    private void DoSomething()
    {
        // no, seriously, do something here
    }
}

INotifyPropertyChangedおよびその他のビューモデルの楽しみは省略されました。
ビューモデルでコマンドを構造化する別の方法は、この回答の最後に示されています。

ここで、 の実装が必要になりますICommand。このような単純なものから始めて、必要に応じて他の機能/コマンドを拡張または実装することをお勧めします。

public class ActionCommand : ICommand
{
    private readonly Action _action;

    public ActionCommand(Action action)
    {
        _action = action;
    }

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

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

    public event EventHandler CanExecuteChanged;
}

ビューモデルをレイアウトする別の方法を次に示します。

public class MyViewModel
{
    private ICommand _myViewModelCommand;
    public ICommand MyViewModelCommand
    {
        get 
        {
            return _myViewModelCommand
                ?? (_myViewModelCommand = new ActionCommand(() => 
                {
                    // your code here
                }));
        }
    }
}
于 2012-08-30T19:54:02.920 に答える
2

Jays の回答に追加するには:

私の一番のお気に入りは、Microsoft の Patterns and Practices team の DelegateCommand です。詳細については、この投稿をご覧ください。

于 2012-08-30T19:54:02.710 に答える