7

基本的に、MVVM を使用して公開 ICommand を公開する場合、デリゲートは公開または非公開にする必要がありますか?

4

3 に答える 3

11

私はそれらをプライベートにします-それらはあなたのクラスのパブリックインターフェイスの一部ではありません。それがパブリック ICommand プロパティの目的です。

于 2011-07-28T18:59:58.777 に答える
4

個人的には、プライベート メソッドを使用しますが、その理由を説明します。を公​​開していますがICommand、これは、消費するビューが Execute を呼び出す前に CanExecute を呼び出す必要があることを示しています。そうでなければ、彼らは API に逆らい、足を撃ちます。その時点で、それはあなたの手から離れます。誰かがリフレクションを使用して重要なプライベート変数を null に設定し、これが原因でクラス設計を壊した場合と同じように...自分自身を撃ちます。では、なぜメンバーを非公開にするのでしょうか。直接呼び出してはならないメンバーを公開する必要がないためです。


基本的に、メンバーの単体テストを行う場合は、個別に行うのではなく、API がメンバーの実行を意図する方法で行います。したがって、実際にはメンバーをテストしていませんが、さらにコマンドをテストしています。これは、次の特定の順序でペアでテストする必要があることを意味します。

if (CanExecute)
{
    Execute;
}
于 2011-07-28T18:59:54.800 に答える
2

増加、減少ボタン、およびスライダーの表示値を簡単に制御するためのMVVMがあります。

テスト ICommand と INotifyPropertyChanged がある場合は、一種の UnitTest を作成できます。

[TestMethod]
public void TestViewModel3()
{
    int min = -10;
    int max = 10000;
    int initVal = 50;
    bool initState = false;

    ToglledSliderModel model = new ToglledSliderModel(initState, initVal, min, max);
    ToglledSliderViewModel viewModel = new ToglledSliderViewModel();
    viewModel.Model = model;

    int status = 567;
    viewModel.PropertyChanged += delegate
    {
        status = 234;
    };

    for (int i = 1; i < 100; i++)
    {
        status = 567;
        ICommand ic = viewModel.IncreaseValue;
        ic.Execute(this);
        Thread.Sleep(2);
        Assert.AreEqual(status, 234);
        Assert.AreEqual(model.SliderValue, initVal + i);
    }
}

ご覧のとおり、INotifyPropertyChanged の動作と ICommand の実行をテストします

于 2012-11-05T13:28:08.900 に答える