私は自分のUserControlsでDataContextを使用する方法をクリーンアップしようとしています。現在、TabItem内のUserControlを親ウィンドウのDataContextにデータバインドする必要がある問題が発生しています。ここでTabItemを親ウィンドウにデータバインドする
は私のウィンドウがどのように見えるかのスケッチです:あなたが見ることができるように
、このウィンドウを動的に「タブ」ItemSourceを経て追加されたTabItemsが含まれているのTabControlを所有しています。 "タブ"にタブ1が設定されているため、この時点でデータバインディングが機能しています。
タブ1には、DiagnosticsViewModelの複数の文字列プロパティにアクセスする必要のあるUserControlが含まれていますが、失敗しました。たとえば:UCNameがStringたDependencyPropertyである
<Grid>
<uc:Tab1UserControl UCName="{Binding Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Grid>
:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=Property1; DataItem=null; target element is 'Tab1UserControl' (Name=''); target property is 'UCName' (type 'String')
タブ1でユーザーコントロールのためのXAMLは次のようになります。
ツリーを検索して最も近いウィンドウのDataContextにバインドし、WindowのDataContextがDiagnosticsViewModelに設定されているとWPFに伝えているのであれば、なぜ私のUserControlのDataContextに使用していないのですか?私は私のUserControlで、私のUserControlがその親からDataContextを継承することができると期待して、過去に何回も不適切に何度もやったので、私のUserControlにDataContext = this
を設定していません。
スヌープが私の問題を明らかにできるかどうか確認したいと思いますが、このGUIはMFCアプリケーションから表示されており、スヌープはWPFダイアログにアタッチできないようです。
私はすでにそれを試して、それは動作しませんでしたが、私はもう一度それを追加し、それはプロパティの仕事の一つを作ったようだ。あなたがチェックアウトした場合は、私は再度チェックして答えとしてマークします! – Dave
私のUserControl *のUCNameは* DependencyPropertyであり、UserControlのコンシューマが初期プロパティ値の1つを設定できるように、このようにしています。それはより受け入れやすいアプローチのように聞こえるでしょうか? – Dave
申し訳ありませんが、何らかの理由でタブで使用されていた場所ではなく、ユーザーコントロール自体の定義にバインドされていると読んでいます。あなたがそれをやっているやり方は、完全に容認できるアプローチです。私はそれをどのように誤解しているのか分かりません! – Astrid