2017-08-10 4 views
0

私は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; 
    } 
+0

UserControlのすべての子要素を反復処理し、各依存プロパティのバインディング式を取得する必要があります。何かこのような:https://stackoverflow.com/questions/3586870/retrieve-all-data-bindings-from-wpf-window – mm8

+0

@ mm8私はその解決策を試みたが、それは子供が見つかりません。 LogicalTreeHelperもVisualTreeHelperも使用しないでください。私はそれが実行されていないWPFに接続されている可能性があります。私のコンテキストはnunitアプリケーションです。 – Johannes

答えて

0

方法GetLocalValueEnumeratorは私が探していたものです。私はちょうどすぐにそれを使用する方法を取得していない。ここでは実装例を示します。

private IEnumerable<string> GetBindingPropertyNames(DependencyObject target) 
    { 
     return from path in GetBindingPaths(target) select path.Split('.').First(); 
    } 

    private IEnumerable<string> GetBindingPaths(DependencyObject target) 
    { 
     var ret = new List<string>(); 
     LocalValueEnumerator lve = target.GetLocalValueEnumerator(); 

     while (lve.MoveNext()) 
     { 
      LocalValueEntry entry = lve.Current; 
      if (entry.Value is DependencyObject) 
      { 
       ret.AddRange(GetBindingPaths(entry.Value as DependencyObject)); 
      } 

      if (BindingOperations.IsDataBound(target, entry.Property)) 
      { 
       Binding binding = (entry.Value as BindingExpression).ParentBinding; 
       ret.Add(binding.Path.Path); 
      } 
     } 
     return ret; 
    } 
関連する問題