Enlace de datos de WPF: ¿Cómo accedo al contexto de datos "principal"?

215

Tengo una lista (ver más abajo) contenida en una ventana. La ventana DataContexttiene dos propiedades, Itemsy AllowItemCommand.

¿Cómo obtengo el enlace para la propiedad de Hyperlink's Commanddebe resolverse contra la ventana 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>
Jordán
fuente
¿Puede ingresar al depurador y avanzar hasta el punto donde se está construyendo la IU? Si es así, puede ingresar a la variable e intentar profundizar
ist_lion
La solución simple (que también funciona en la aplicación Windows 8 Store / Metro) está aquí: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Respuestas:

417

Podrías probar algo como esto:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
flq
fuente
2
Utilicé esto para vincularme a un ICommand en mi VM desde un ContextMenu configurado en un ListBoxItem desde un Estilo. Funcionó genial, gracias !!
Wil P
1
¿Cómo se hace esto en una aplicación de Windows 8? Utilicé "ElementName = ..." para que funcione, pero filtra el DataContext
Joris Weimar
3
¿Qué quieres decir con fuga?
flq
Lamentablemente no funcionó para mí porque el padre está en un archivo diferente.
Thomas
@ Thomas6767, espero que haya resuelto su problema, ¿puede por favor su código?
Mohammed Abrar Ahmed
37

Esto también funcionará:

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

ListViewheredará DataContextde Window, por lo que también está disponible en este punto.
Y dado que ListView, al igual que los controles similares (p Gridview. Ej . ListBox, Etc.), es una subclase de ItemsControl, los Bindingcontroles de ese tipo funcionarán perfectamente.

Kylo Ren
fuente
15
(Mirando el póster y el editor) Encuentro divertido este post ...: D
Jack Frost
@JackFrost si Yoda interfiere con el trabajo de Kylo'l nuevamente. Kylo va a matar a Yoda. : P
Kylo Ren
No, no puede. Yoda es uno con la fuerza ahora. Jejeje
Jack Frost
10

Esto también funciona en Silverlight 5 (quizás también antes pero no lo he probado). Usé la fuente relativa de esta manera y funcionó bien.

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

sangers
fuente