2016-04-18 11 views
0

私は問題を解決するためにさまざまな方法で試してみましたが、役に立たなかったので、ここの誰かが助けてくれることを願っています。タイプコンバータからのバインディングへのアクセス?

私は、タイプ変換を使用して値を文字列からカスタムデータ型(例:MyCustomType)に変換する双方向バインディングを持つテキストボックス要素を持っています。これはうまくいきますが、私のプロジェクトの要件が変更されたため、変換が行われる前に余分な処理を行う必要があります。

しかし、この余分な処理を実行するには、「ソース」テキストボックスまたはバインディングコンテキストにアクセスできる必要があります。どちらも私はアクセスすることができませんでした。

タイプコンバータのConvertFrom()メソッドからソーステキストボックスにアクセスする方法はありますか?

私はITypeDescriptorContextパラメータを(WPFによって)ConvertFrom()メソッドに渡しましたが、ほとんどのプロパティはnullです。私もMultiValueConverterを使用して、完全に型コンバータを避け、しかし、これは余分なコードのLOTにつながった、と試してみました

public class MyCustomTypeConverter : TypeConverter 
{ 
    ... 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     // Context is 
     return new MyCustomType(value); 
    } 
    ... 
} 

The context within ConvertFrom()

Context - additional properties

すなわち

本当に助けにはなりませんでした。私はタイプ変換がはるかにエレガントなので、このルートを避けることを好むだろう。

ご迷惑をおかけして申し訳ございません。 :)

+1

は、なぜあなたはバインディングアクセスしたいん:このテキストボックスのバインディングにアクセスするには、単に、その後TextBoxとしてsourceTextBoxをキャストすることができますか?他の方法があるかもしれません – Nitin

+0

私はTypeConvertersからBindingsにアクセスすることはできません。彼らはDataLayerで動作している必要があります、また、不必要な作業がたくさんあるようです。あなたが問題を更新すれば、何が全体の問題であるのか、人々はそう簡単に手助けすることができます。 –

+0

@Nitin、私はソースTextBoxにアクセスしようとしていたので、別のメソッド(参照)に渡すことができ、検証の失敗に対して特定のタスクを実行できます。 これは必ずしもこれを実行する最善の方法ではありませんが、プロジェクトの要件は開発段階でかなり遅れて変更されていますが、これは機能的な、やや一時的な解決策です。 (時間がたつと、私のリファクタリングのリストにはかなり高い)。 ご回答いただきありがとうございます。 – XtraSimplicity

答えて

1

編集:私は(INotifyDataErrorを使用して代わりの例外に、検証)検証が行われている方法を変更することになった、となってしまった再書き込み、私のタイプ・コンバータでConvertFrom()方法を、そのようなことを私ではありませんもはやTypeDescriptorのコンテキストにアクセスする必要があります。

ConvertFrom()メソッドのコンテキストを使用することはお勧めできません。これは、プライベートプロパティであるため、プロパティが将来存在することが保証されていないためです。 、それは)プライベートプロパティはMSの開発チームからの通知なしに名前を変更/削除することができていることを前提とするのがベストです、そしてプログラムでプロパティの値を設定するとき、それはそうのように、設定されていません。あなたがいる場合は

TypeConverter converter = TypeDescriptor.GetConverter(typeof(MyCustomType)); 
converter.ConvertFrom(mySourceValue); 

これを読んで実際にcontextパラメータにアクセスする必要がある場合は、以下の方法で自己責任で行うことができます。


私はValueConverterContextクラスを呼び掛けており、このような民間_targetElementフィールド、アクセスすることによりこの問題を解決することができた。それにもかかわらず、あなたの助けを

var sourceTextBox = context.GetType().GetField("_targetElement", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(context) 

感謝を。:)

編集:

var BindingExpression = sourceTextBox.GetBindingExpression(TextBox.TextProperty); 
関連する問題