私はすべての3つの答えに投票したいと思いますが、私はそれのための評判を持っていません。これに投票して投票します;)
私はあなたのおかげで問題を解決しました!
は、ここに私がやったことだ:イベントがあることSourceUpdatedで
- は新しいValueConverterを作成した値がそれをトラフを渡されたときに起動します。
- 既存のすべてのコンバータを継承します。
を作成存在しない場合、コンバーターが既にあるかどうコンストラクタで参照、(Bindingから継承)新しいBindingクラスを作成します。この機能のワイヤーを必要とする各フォームの
if (Converter == null) {
Converter = new GcBindingConverter();
}
if (Converter.GetType().IsAssignableFrom(typeof(GcBindingConverter))) {
((GcBindingConverter)Converter).SourceUpdated += SourceUpdatedHandler;
}
は、
static void WireDirtyBindings(DependencyObject element, ModelStateBase ModelState)
{
Binding bb = null;
// find bindings on elements:
if ((object.ReferenceEquals(element.GetType, typeof(TextBox)))) {
bb = BindingOperations.GetBinding(element, TextBox.TextProperty);
} else if ((object.ReferenceEquals(element.GetType, typeof(ComboBox)))) {
bb = BindingOperations.GetBinding(element, ComboBox.SelectedValueProperty);
// other objects...
}
if (bb != null) {
// wire eventhandler to event:
doWireHandler(bb, ModelState);
}
// Now, recurse through any child elements
if (element is FrameworkElement || element is FrameworkContentElement) {
foreach (object childElement in LogicalTreeHelper.GetChildren(element)) {
if (childElement is DependencyObject) {
WireDirtyBindings((DependencyObject)childElement, ModelState);
}
}
}
}
:イベントハンドラにイベントは、私たちにModelStateにハンドラを入れています
私はデータ入力の多くを持っている各フォームのために今書かなければならない唯一のものは次のとおりです。
BaseBinding.WireDirtyBindings(this, _modelState);
5:フォームでは、があれば言うにModelStateプロパティへの変更ボタンの有効状態を保存バインドが変更されています。私はこれもインタフェースを使用することができますが、モデルステートのようなものを既に持っているので、これを置くのが良い場所です。
これはほんの数行のコードでうまく動作します。今はエンドユーザーが保存せずにたくさんの変更を行うことを心配する必要はありません。
mattythomas2000と同じコメント:はい、私はすでに、すべての種類のものを行う多くの価値のあるコンバーターを持っています。カスタムバインディングクラスを介してvalueconverterを設定すると、それらの値はクリアされます。バインディングクラスに単純な更新イベントはありませんか? –
あなたは複合IValueConverterを設計したいかもしれません...値の変更を組み合わせるときにどのようなロジックを実装したいのかわかりませんが、いくつかの値コンバータを1つにマージできるIValueConverterの実装を簡単に作成できます – flq