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>

¿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}" ...

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.


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}"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.