私はWPFアプリケーションなしでTraceLogger(リスナー)なしで実行できる汎用テストを作成したいと思います。UserControlからバインディングのリストを取得
ジェネリックテストは、インターフェースがUserControlのバインディングと比較して、欠落しているか、バインディングが多すぎるかどうかを確認するのに役立ちます。
IVMはのviewmodel Vのインタフェースタイプである
vはIVMに結合するようになっている図です。
var names_binding = listener.bindNames.Distinct(); //this is what i want to get rid of.
var names_interface = ivm.GetProperties().Select(prop => prop.Name).Distinct();
var tooMany = names_interface.Except(names_binding);
var tooFew = names_binding.Except(names_interface);
私は、以下のいずれかのようなコードを使用して特定の条件下に特異的に結合する名前のリストを取得することができます。 listener
はバインディングエラーをリッスンします。
object obj = new object();
T_V view = new T_V();
view.DataContext = obj; // empty object - all binding will fail
DoEvents(); // Do Events pumps WPF so binding happens
私はusercontrolを検査し、すべてのバインディング名を渡すコードに置き換えたいと思っています。すべてのバインディングをユーザーコントロールから取得する方法はわかりません。私はある種の出発点が必要です。
したがって、本質的に私は、バインディングまたは完全なバインディングパスのプロパティ名を配信する実装を探します。その情報をUserControlから取得する方法はありますか?
public IEnumerable<string> GetBindingPaths<T_V>() where T_V : UserControl, new()
{
var ret = Enumerable.Empty<string>();
T_V view = new T_V();
//// view.GetBindingExpression ???
//// view.GetLocalValueEnumerator ???
return ret;
}
UserControlのすべての子要素を反復処理し、各依存プロパティのバインディング式を取得する必要があります。何かこのような:https://stackoverflow.com/questions/3586870/retrieve-all-data-bindings-from-wpf-window – mm8
@ mm8私はその解決策を試みたが、それは子供が見つかりません。 LogicalTreeHelperもVisualTreeHelperも使用しないでください。私はそれが実行されていないWPFに接続されている可能性があります。私のコンテキストはnunitアプリケーションです。 – Johannes