WPFデータバインディング:「親」データコンテキストにアクセスするにはどうすればよいですか?


215

ウィンドウにリスト(以下を参照)が含まれています。ウィンドウにDataContextは、Itemsとの2つのプロパティがありAllowItemCommandます。

ウィンドウのプロパティに対して解決する必要があるHyperlinkCommandプロパティのバインディングを取得するにはどうすればよいDataContextですか?

<ListView ItemsSource="{Binding Items}">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="Action">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <StackPanel>
              <TextBlock>

                <!-- this binding is not working -->
                <Hyperlink Command="{Binding AllowItemCommand}"
                           CommandParameter="{Binding .}">
                    <TextBlock Text="Allow" />
                </Hyperlink>

              </TextBlock>
            </StackPanel>
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

デバッガーに入り、UIが構築されているところまでステップスルーできますか?もしそうなら、変数に入ってドリルアップしてみてください
ist_lion

シンプルなソリューション(Windows 8 Store / Metroアプリでも機能します)はこちらです:http
LMK

回答:


417

あなたはこのようなことを試すことができます:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...

2
これを使用して、Style内からListBoxItemに設定されたContextMenuからVMのICommandにバインドしました。ありがとうございました。
Wil P

1
Windows 8アプリでこれをどのように行うのですか?「ElementName = ...」を使用して機能させましたが、DataContextがリークします
Joris Weimar

3
リークとはどういう意味ですか?
flq 2013年

親が別のファイルにあるため、残念ながらうまくいきませんでした。
トーマス

@ Thomas6767、あなたがあなたの問題を解決したことを願ってあなたのコードを喜ばせることができます。
Mohammed Abrar Ahmed

37

これも機能します:

<Hyperlink Command="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl},
                             Path=DataContext.AllowItemCommand}" />

ListViewDataContextfrom を継承するWindowため、この時点でも使用できます。
また、ListView同様のコントロール(たとえばGridviewListBoxなど)はのサブクラスでItemsControlあるBindingため、そのようなコントロールのは完全に機能します。


15
(ポスターと編集者を見て)私はこの投稿がおかしいと思います...:D
Jack Frost

ヨーダが再びカイロの作業を妨害する場合は@JackFrost。カイロはヨーダを殺そうとしている。:P
カイロレン

いいえ、できません。依田は今、力を持っています。Hehehe
ジャックフロスト

10

これはSilverlight 5でも機能します(おそらく以前にも同様ですが、テストしていません)。私はこのような相対ソースを使用し、それはうまくいきました。

RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=telerik:RadGridView}"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.