TextBox のような WinForms コントロールには、コントロールのコンテンツを変更した後に値「true」を取得し、手動で「false」に設定できる Modified プロパティがあります。彼らの WPF 類似物にはそのようなプロパティがないようです (新しい命名スタイルの IsModified もありません)。変更イベントを自分で処理する必要がありますか、それとももっと便利な方法がありますか? たとえば、いくつかのテキスト ボックスと、それらの内容をプレビュー用の 1 つのドキュメントに結合する関数があります。プレビューを開くと、テキストボックスが変更されていない場合はドキュメントの古いコンテンツを保持したい、または少なくとも 1 つのテキストボックスが編集された場合は関数を呼び出して新しいドキュメントのコンテンツを生成したい。
2 に答える
UIはデータではないため、WPFにはそれがありません。したがって、UIはデータが変更されたかどうかに関する情報を保存する適切な場所ではありません。
くだらない恐竜の winforms では、UI とアプリケーション ロジック/データを明確かつ真に分離することはできません。したがって、これらの完全に分離された概念を組み合わせるために、あらゆる種類の恐ろしいハックがあります。
MVVM パターンを使用して、正しく開発する方法を学ぶ必要があります。次に、UI 要素に状態データを配置しても意味がないことに気付くでしょう。
WPF では、ViewModel/Model を介してすべてを制御する方が簡単です...これは多すぎるか、探しているものではない可能性があります。しかし、経験を通して、私は以下のパターンが簡単な使い方で報われていると感じています. IEditableObject、INotifyPropertyChanged、および場合によっては IEquitable を実装するクラス/モデルで、単純なデータ クラス (現在/質問で使用しているすべてのプロパティを含む) をラップします。クラスを Data と呼びましょう。ラッパー クラスでフィールドを作成します。
Data _current;
Data _proposed;
Data _previous;
IEditableObject では、BeginEdit()、EndEdit()、および CancelEdit() を実装する必要があります。それらでは、状態_current、proposed、およびpreviousを制御する必要があります。例えば、
public void CancelEdit()
{
_current = _previous;
_proposed = null;
}
public void EndEdit()
{
_previous = _proposed;
}
public void BeginEdit()
{
_proposed = _current;
}
上記のメソッドでさらにロジックが必要になる場合があるため、これは単なる例です。オブジェクトに変更があるかどうかを知る鍵は、フラグを実装することです。多くの人はそれを IsDirty と呼んでいます。
pubic bool IsDirty { get { return _current != _previous; } }
これで、このクラスのユーザーは簡単に状態を確認できます。ああ、さらに、各プロパティには次のメカニズムがあります。
public string Example
{
get { return _current.Example;}}
set
{
if(_current.Example == value) return;
BeginEdit();
_current.Example = value;
RaisePropertyChanged (() -> Example);
}
}
IEditableObject を実装することの良い点は、すべてのコントロールがそれに応答することです。DataGrid はその良い例であり、編集をキャンセルすることで簡単に元の状態に戻ることもできます。とにかく、参照すべきサンプルがたくさんあります。あなたがその道を歩み始めることができることを願っています... PSこのパターンはWPFが登場する前に使用されていました.WinFormsでも非常に一般的です.