34

私はいくつかのデータ バインディング エラーをスローしているプロジェクトを持っています。一例は次のとおりです。

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')

私の質問は、このバインディングが実際に宣言されている場所 (XAML またはコードで宣言されている) を判断する方法があるかどうかです。

私がこれまでに試したこと:

  • レベルが o All に設定された System.Windows.Data 名前空間のデバッグ トレースを追加しました。これはこれ以上有用な情報を生成しませんでした
  • Path が に設定されているすべてのバインディング式を見つけることを期待して、プロジェクト内でBindingという単語のテキスト検索を試みましたHorizontalContentAlignment。1つだけ見つけて削除しましたが、それが欠陥のあるものではなかったことを示すメッセージがまだ表示されています..

このバインディングが宣言されている正確な場所について、WPF がより有用な情報を吐き出すようにする他のトリックを知っていますか?

アップデート

もう少し検索した後、これはスタイルがに適用されていることが原因であると確信していMenuItemます。ただし、問題のあるバインディングが宣言されている場所を特定することはまだできません..

更新 2

問題が見つかりました。ただし、問題を見つけることは、ほとんどの場合、エラー メッセージの限られた情報に基づいて暗闇で検索することであったため、疑問は残ります。

結局のところ、バインディングはスタイルで宣言されています。そして、スタイルは私のアプリケーションにはありません。おそらく のデフォルトのスタイルですMenuItem。したがって、今のところ問題を解決するために、手動でHorizontalContentAlignmenton allを設定しましたMenuItems。エラーの理由はMenuItem、コードで生成される操作の順序に関係しています。それについては、別の新しい質問を投稿します。

したがって、今のところ、この話の教訓は、欠陥のあるバインディングがどこで宣言されているかを判断するためのより良いメカニズムが必要であると私が感じているということです。バインディングのスタック トレースのようなものを見たいのですが..

コードまたはマークアップでバインディングが宣言されている場所を特定する他のツールまたは方法を誰かが知っている場合に備えて、質問をもう少し開いておきます。

hereに適用されているスタイル/バインディングに関するMenuItems別の質問を投稿しました。

4

4 に答える 4

105

WPFバインディングエラーをデバッグする場合、エラーをセミコロンで分割し、最後から始めるのが最も簡単だと思います。

  1. System.Windows.Data Error: 4 :
  2. Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment;
  3. DataItem=null;
  4. target element is 'MenuItem' (Name='');
  5. target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')

したがって、最後から始めます。

  • #5は、失敗しているバインディングがどのプロパティに含まれているかを示します。あなたの場合、それはHorizontalContentAlignment

  • #4は、失敗したプロパティを含む要素です。これは、それを識別するためMenuItemのプロパティがありません。Name

    したがって、どこか<MenuItem HorizontalContentAlignment="{Binding ...}" />にバインディングエラーの原因となっているがあります。

  • #3は、ターゲット要素の背後にあるDataItem、またはです。DataContextそれnullはあなたのためのように見えますが、あなたのバインディングがDataContextを参照していないように見えるので、それは問題ではありません。

    ただし、これは、が通常のMenuItemの一部ではないことを示しています。これはVisualTree、通常、DataContextが親オブジェクトから継承されているためです。

  • #2には、実際のバインディングエラーとバインディングに関する情報が含まれています。実際には、さらに複数の部分に分割できます。

    • Cannot find source for binding

    • with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''.

    • BindingExpression:Path=HorizontalContentAlignment;

    「ソースが見つかりません」とは、バインディングがバインドするソースオブジェクトを見つけることができないことを意味します。この場合、そのソースオブジェクトは{RelativeSource AncestorType={x:Type ItemsControl}FindAncestorおよびAncestorLevel=1のデフォルトであるため、RelativeSource無視します)である必要があります。

    そして、#2の最後の部分は、Pathバインドしようとしていることを示しています。HorizontalContentAlignment

したがって、すべてをまとめると、コードのどこかに、<MenuItem>をバインドしようとしてHorizontalContentAlignmentいるItemsControl.HorizontalContentAlignmentが、バインドでが見つかりませんItemsControl

RelativeSource FindAncestorバインディングを使用してItemsControl、を検索しています。これは、ビジュアルツリーを検索して最も近いを検索しますが、検索されないため、VisualTree階層ItemsControlの上位にある必要はありません。ItemsControlMenuItem

この問題は、他のXAMLコードContextMenusと同じ部分ではないため、よく見られます。(がアタッチされてVisualTreeいるメインのオブジェクトを参照するには、この例のようにプロパティを使用できます。VisualTreeContextMenuPlacementTarget

バインディングエラーを理解すると、XAMLでその原因を簡単に見つけることができます。

アプリケーションのサイズに応じて、通常、次のいずれかを実行します。

  • バインディングエラー(あなたの場合)から「ターゲット要素」をアプリケーションで検索し、MenuItemそれらのいずれかがバインディングで「ターゲットプロパティ」(HorizontalContentAlignment)を設定しているかどうかを確認します

  • バインディングエラー()から「ターゲットプロパティ」をアプリケーションで検索して、HorizontalContentAlignmentこの問題の原因となっているバインディングを見つけます

  • バインディングエラーに表示されたバインディングテキストから、アプリケーションでかなりユニークなものを検索します。あなたの場合、バインディング{x:Type ItemsControl}の一部となるものを検索してみることができますRelativeSource。そのようなフレーズの検索結果が多すぎないようにする必要があります。

  • SnoopWPFInspectorなどのサードパーティツールを使用して、実行時のバインディングエラーを追跡します。

    以前はSnoopを使用したことがありますが、これを使用するには、アプリケーションを起動し、Snoopを実行して、実行中にアプリケーションのVisualTreeを検査する必要があります。次に、検索バーに「MenuItem」などと入力してVisualTreeを検索し、すべてのVisual TreeをフィルタリングしてMenuItemsから、プロパティを調べて、バインディングエラーがあるものを見つけます(HorizontalContentAlignmentプロパティは、バインディングエラー)。

    MenuItem内にいる場合は、MenuItemを描画してSnoopに表示するにはContextMenu、それを開く必要があることに注意してください。ContextMenu

于 2013-01-25T14:00:58.080 に答える