1

どちらの ICommand オブジェクトも ViewModel にバインドされています。

最初のアプローチはよく使われるようです。

しかし、2 番目のものはコードの行数を節約しますが、Binding が更新されるたびに新しい ICommand オブジェクトを作成しないので、リソースの無駄になりますか?!

private LightCommand _deleteDocumentCommand;
        public LightCommand DeleteDocumentCommand
        {
            get { return _deleteDocumentCommand ?? (_deleteDocumentCommand = new LightCommand(() => DeleteDocument(), () => CanDeleteDocument)); }
        }

        public LightCommand DeleteDocumentCommand
        {
            get { return new LightCommand(() => DeleteDocument(), () => CanDeleteDocument); }
        }
4

3 に答える 3

1

はい、2番目の方法では、コマンドが参照されるたびに新しいコマンドが作成されますが、最初の方法はかなり読みにくいと思います。

ViewModel でコマンドを作成する私の好みの方法は次のとおりです。

private LightCommand _deleteDocumentCommand;
public LightCommand DeleteDocumentCommand
{
    get 
    {
        if (_deleteDocumentCommand == null)
        {
            _deleteDocumentCommand = new LightCommand(
                () => DeleteDocument(), () => CanDeleteDocument);
        }

        return _deleteDocumentCommand;
    }
}

コードの行数は増えるかもしれませんが、読みやすく、理解しやすいものです。その上、通常、すべてのパブリック プロパティ/コマンドはマクロによって生成され#region Properties、ViewModel を使用している間ずっと折りたたまれたままの領域にダンプされるため、get/set メソッドのページをスクロールする必要はありません。

于 2011-09-09T16:20:49.640 に答える
0

私はあなたが検証を探していると思います、そしてそれは正しいです:

Binding が更新される (またはコマンドが呼び出される) たびに、新しいオブジェクトがインスタンス化されます。明らかな資源の浪費のように見えます。

于 2011-09-09T16:10:20.257 に答える
0

はい、そうです。次のようなものになるように、一度インスタンス化することをお勧めします。

LightCommand DeleteCommand { get;  set;}

次に、VM のインスタンス化でそれに割り当てます。または、最初の例を使用できます。

于 2011-09-09T16:08:57.567 に答える