web-dev-qa-db-fra.com

Liaison de données WPF: comment accéder au contexte de données "parent"?

J'ai une liste (voir ci-dessous) contenue dans une fenêtre. La fenêtre DataContext a deux propriétés, Items et AllowItemCommand.

Comment obtenir la liaison pour la propriété Hyperlink's Command doit être résolue par rapport à la fenêtre 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>
197
Jordan

Vous pouvez essayer quelque chose comme ça:

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

Cela fonctionnera également:

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

ListView héritera de DataContext de Window, de sorte qu'il est également disponible à ce stade.
Et puisque ListView, tout comme des commandes similaires (par exemple, Gridview, ListBox, etc.), est une sous-classe de ItemsControl, le Binding car de tels contrôles fonctionneront parfaitement.

22
Kylo Ren

Cela fonctionne également dans Silverlight 5 (peut-être plus tôt, mais je ne l’ai pas testé). J'ai utilisé la source relative comme celle-ci et cela a bien fonctionné.

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

7
sangers