WPF数据绑定:如何访问“父”数据上下文?


215

我在窗口中包含一个列表(见下文)。窗口DataContext具有两个属性,ItemsAllowItemCommand

如何获得对绑定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?如果是这样,您可以进入变量并尝试深入
了解吗?

简单的解决方案(也适用于Windows 8 Store / Metro应用程序)在这里:http
LMK

Answers:


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

ListView将继承DataContextWindow,因此目前也可用。
并且,由于ListView就像类似的控件(例如GridviewListBox等)一样,是的子类ItemsControl,因此Bindingfor控件将完美地工作。


14
(看着海报和编辑)我发现这篇帖子很有趣...:D
Jack Frost

如果Yoda再次干扰Kylo'l的工作,则@JackFrost。Kylo要杀死Yoda。:P
Kylo Ren

不,他不能。尤达现在是一支力量。嘿嘿
杰克·弗罗斯特

10

这也可以在Silverlight 5中使用(也许也可以更早使用,但我尚未对其进行测试)。我使用这样的相对来源,并且效果很好。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.