そのViewModelのプロパティの編集のキャンセルをサポートするために、一部のViewModelが継承するIEditableObjectを実装するジェネリッククラスを実装することを検討してきました。これの主な用途は、[OK]ボタンと[キャンセル]ボタンがあるWPFのモーダルダイアログです。
オンラインで次の実装を見つけました。
- TypeDescriptorとReflectionを介したIEditableObjectのジェネリック実装
- Paul Stovell:WPFおよびWindowsフォーム用のIEditableObjectアダプター
これは私には非常に複雑に思えますが、それらが提供する機能の一部が欠けているかどうかはわかりません。1つは、ディープコピーをサポートしていないため、私の世界では、MemberwiseCloneを使用してシャローコピーを実行できます。何かのようなもの:
private Item backupCopy;
private bool inEdit;
public void BeginEdit()
{
if (inEdit) return;
inEdit = true;
backupCopy = this.MemberwiseClone() as Item;
}
public void CancelEdit()
{
if (!inEdit) return;
inEdit = false;
this.Name = backupCopy.Name;
}
public void EndEdit()
{
if (!inEdit) return;
inEdit = false;
backupCopy = null;
}
この例はもちろん、ViewModelsが継承するための一般的な抽象基本クラスに含まれている必要がありますが、アイデアは得られます...
ここでの違いは何ですか?ディープコピーをサポートしない以外に、私のアプローチの欠点は何ですか?ディープコピーをサポートするためにどのように変更しますか(まだ必要かどうかはわかりません)?
アップデート:
この記事は、リフレクションを使用した私の実装よりも優れた実装を示していることがわかりました。私がリンクした他の2つの記事よりもはるかに簡単です:
ディープコピーをサポートするためにこれをどのように拡張できますか?