2012-09-10 7 views
5

私はMVVMに適度に新しく、xamlの背後にある単純なコード(MVのテスト容易性など)よりもMVVMの利点の一部を理解しています。私たちはCaliburn Microを使っていくつかのバインディングを実行していますが、それは無関係です。特定のバインディング{binding ...}を使用することができます。バインディングのコンパイル時間チェック?

私は、すべてが正しく行われた場合、VMがVを何も知らないという論理を理解していますが、VとVMの間の動的実行時バインディングを使用しているためです。それぞれの結合表現の合法性。たとえば、UserNameというUIコンポーネントがある場合、Caliburnは実行時にUserNameというVMプロパティにその値をバインドしようとします(Value = "{{{UserName}"というようなことに似ています)。しかし、VMプロパティの名前を変更したり、UIコンポーネント名やバインディング式のスペルを間違えた場合、実行時まで問題がないことがわかります。

UIコンポーネントまたはページが特定のインターフェイスにバインドされるようにxamlに伝えることができれば、コンパイラは他の作業テスト部門によって(そしてそれは私がかなり頻繁に)行われます。

私たちがインターフェイスまたはオブジェクトタイプにバインドしていることをxamlに伝える方法はありますか?バインディングを検証するためにxamlアプリケーションにプラグインできるツールはありますか?

答えて

4

コンパイラはXAMLのコンパイル時間チェックをサポートしていませんが、XAMLReaderクラスを使用して各XAMLファイルをインスタンス化し、次にcustom TraceListenerを使用して待機するカスタムビルドタスクを作成することで、バインディングエラー。

さらに、コードを使用してデータバインディングを行う準備ができている場合は、プロパティ名を直接参照するバインディングを作成できます。以下の(未テスト)のような何かが

Binding createBinding<TProperty>(Expression<Func<TProperty>> property, object source) 
{ 
    MemberExpression me = property.Body as MemberExpression; 
    if (me == null || me.Expression != property.Parameters[0] 
      || me.Member.MemberType != MemberTypes.Property) { 
     throw new InvalidOperationException(
      "Now tell me about the property"); 
    } 
    Binding b = new Binding(me.Member.Name); 
    b.Source = source; 

    return b; 
} 

// sample code 
Binding b = createBinding(()=>this.FontSize, this); 
textBlock1.SetBinding(TextBlock.FontSizeProperty, b); 
-1

実行時に出力ウィンドウでバインディングエラーを検索することで、バインディングが失敗したかどうかを簡単に確認できます。バインディングのデバッグ情報を詳細に設定する必要があります。

+0

-1:OPはコンパイル時に明示的にソリューションを要求しました。 –

+0

aha ...これは代替品です –

+3

これはありません。 OPはすでにこれについて知っていて、それを使いたくない。 –

0

あなたは尋ねる、「バインディングを検証するために、XAMLアプリケーションにプラグインすることができますいくつかのツールはありますか?」。

はい、Snoopを使用すると、実行時に不正なバインディングを検出できます。それはコンパイル時ではありませんが、それと同様に効果的です。

詳しくは、Solution 8ReSharper WPF error: "Cannot resolve symbol "MyVariable" due to unknown DataContext")を参照してください。

関連する問題