2017-01-30 3 views
0

私は自分のUserControlsでDataContextを使用する方法をクリーンアップしようとしています。現在、TabItem内のUserControlを親ウィンドウのDataContextにデータバインドする必要がある問題が発生しています。ここでTabItemを親ウィンドウにデータバインドする

は私のウィンドウがどのように見えるかのスケッチです:あなたが見ることができるように

enter image description here

、このウィンドウを動的に「タブ」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ダイアログにアタッチできないようです。

答えて

1

RelativeSource、ElementNameなどを使用してバインディングのソースを変更した場合、そのバインディングはデータコンテキストではなく、指定した要素に直接適用されます。つまり、コードでは、ユーザーコントロールはDiagnosticsクラス自体のProperty1というプロパティにバインドしようとします。

は、ユーザーコントロールのコードで

<Grid> 
    <uc:Tab1UserControl UCName="{Binding Path=DataContext.Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
</Grid> 

を使用して試してみて、それが問題を修正するかどうかを確認します。

(ユーザーコントロールのポイントは、それが属するウィンドウが特定のプロパティを持つdatacontextを持つことを知っているというアイデアです。特に、ユーザーコントロールのポイントは、再利用可能 - ユーザーコントロールに依存プロパティを持たせて、それを使用するときに適切なプロパティにバインドする方が良いと感じるでしょうが、これはコンテキストが不足していることが原因です)

+0

私はすでにそれを試して、それは動作しませんでしたが、私はもう一度それを追加し、それはプロパティの仕事の一つを作ったようだ。あなたがチェックアウトした場合は、私は再度チェックして答えとしてマークします! – Dave

+0

私のUserControl *のUCNameは* DependencyPropertyであり、UserControlのコンシューマが初期プロパティ値の1つを設定できるように、このようにしています。それはより受け入れやすいアプローチのように聞こえるでしょうか? – Dave

+0

申し訳ありませんが、何らかの理由でタブで使用されていた場所ではなく、ユーザーコントロール自体の定義にバインドされていると読んでいます。あなたがそれをやっているやり方は、完全に容認できるアプローチです。私はそれをどのように誤解しているのか分かりません! – Astrid

関連する問題