2011-01-21 12 views
2

20個のテキストボックスがあり、すべてが異なるBLLクラスにバインドされているウィンドウがあるとします。 wpfでバインドするときに、テキストボックスからプロパティに渡される値をインターセプトするにはどうすればよいですか?私は、すべてのプロパティの代わりに汎用ソリューションを探しています。カスタム処理のためにWPFバインディングをインターセプトする方法

私はBindingクラスから継承することができますが、データが要素からプロパティに渡されるたびに、そのクラスにイベントがありますか?または、より良い解決策がありますか?

答えて

1

私はすべての3つの答えに投票したいと思いますが、私はそれのための評判を持っていません。これに投票して投票します;)

私はあなたのおかげで問題を解決しました!

は、ここに私がやったことだ:イベントがあることSourceUpdatedで

  1. は新しいValueConverterを作成した値がそれをトラフを渡されたときに起動します。
  2. 既存のすべてのコンバータを継承します。
  3. を作成存在しない場合、コンバーターが既にあるかどうコンストラクタで参照、(Bindingから継承)新しいBindingクラスを作成します。この機能のワイヤーを必要とする各フォームの

    if (Converter == null) { 
        Converter = new GcBindingConverter(); 
    } 
    
    if (Converter.GetType().IsAssignableFrom(typeof(GcBindingConverter))) { 
        ((GcBindingConverter)Converter).SourceUpdated += SourceUpdatedHandler; 
    } 
    
  4. は、

    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プロパティへの変更ボタンの有効状態を保存バインドが変更されています。私はこれもインタフェースを使用することができますが、モデルステートのようなものを既に持っているので、これを置くのが良い場所です。

これはほんの数行のコードでうまく動作します。今はエンドユーザーが保存せずにたくさんの変更を行うことを心配する必要はありません。

1

バインディングには、IValueConverterを実装するクラスを割り当てるConverterプロパティがあります。バインディングから継承することができれば、その専門分野でConverterを設定し、それを続行することができます。

+0

mattythomas2000と同じコメント:はい、私はすでに、すべての種類のものを行う多くの価値のあるコンバーターを持っています。カスタムバインディングクラスを介してvalueconverterを設定すると、それらの値はクリアされます。バインディングクラスに単純な更新イベントはありませんか? –

+0

あなたは複合IValueConverterを設計したいかもしれません...値の変更を組み合わせるときにどのようなロジックを実装したいのかわかりませんが、いくつかの値コンバータを1つにマージできるIValueConverterの実装を簡単に作成できます – flq

1

あなたが探しているソリューションはバリューコンバータだと思います。このmsdnページでは、これを行う方法について説明します - >http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion

+0

はい、私はすでにあらゆる種類の処理を行うvalueconvertersをたくさん持っています。カスタムバインディングクラスを介してvalueconverterを設定すると、それらの値はクリアされます。バインディングクラスに単純な更新イベントはありませんか? –

+0

もしそれらがすべて同じ論理を実装しているなら(例えばflqが示唆しているような何らかの複合IValueConverterを使って)、バリューコンバータをリソースに格納して、それを各バインディングに再利用できるはずです。 – mattythomas2000

1

私は間違っているかもしれませんが、コンバータを試しましたか?ここではあなたがそれをチェックアウトすることができ、かなり良いサイトです:

http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters

+0

mattythomas2000と同じコメント:はい、私はすでに、すべての種類のものを行う多くの価値のあるコンバーターを持っています。カスタムバインディングクラスを介してvalueconverterを設定すると、それらの値はクリアされます。バインディングクラスに単純な更新イベントはありませんか? –

+0

なぜ価値コンバーターが最適な方法でないのですか?あなたのxamlにはたくさんのテキストボックスがあります。それらはいくつかのviewModelやそのようなものにバインドされています。あなたは正確に何をしたいのですか?主な目標は何ですか?なぜ価値コンバーターが適切なソリューションではないのですか? – paxx

関連する問題