绑定到父控件中的属性

时间:2013-04-03 13:45:33

标签: wpf xaml

我有以下情况:

Window
  |_Grid
      |_ListView (MainProductGrid)
           |_View
               |_GridView
                    |_GridViewColumn
                             |_CellTemplate
                                     |_DataTemplate
                                             |_Label (LabelID)

现在,我想在LabelID中显示ListView中行的索引。 所以我做了以下几点:

<ListView ItemsSource="{Binding Path=ProductItems}" AlternationCount="{Binding Path=ProductItems.Count}">
...

对于标签,我有以下内容:

<Label x:Name="LabelID" 
       Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, 
       Path=(ListView.AlternationIndex)}"/>

但它的LabelID只显示0 .. 所以我认为TemplatedParent没有指向ListView控件.. 那么我如何纠正绑定指向“上层父”,在我的情况下是ListView?

提前致谢

################

更新: 这是完整的xaml ......

<Grid x:Name="mainGrid">
        <ListView  ItemsSource="{Binding Path=ProductItems}" AlternationCount="{Binding Path=ProductItems.Count}" x:Name="MainProductGrid">
                <ListView.View>
                    <GridView AllowsColumnReorder="False">
                    <GridViewColumn x:Name="gvc" Header="id" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding (ListView.AlternationIndex),RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Product name" DisplayMemberBinding="{Binding Path=ProductName}"  Width="auto" />
                    </GridView>
                </ListView.View>
            </ListView>
    </Grid>

3 个答案:

答案 0 :(得分:20)

请试试这个:

 <Label Content="{Binding (ListView.AlternationIndex),
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"  />

更新: 这里是正确的xaml,绑定应该是relativesource = ListViewItem,但是网格列宽度有问题:

  <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn x:Name="gvc" Header="id"  Width="30">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding (ListView.AlternationIndex),
                                RelativeSource={RelativeSource FindAncestor,
                                    AncestorType={x:Type ListViewItem}}}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Product name" 
                                DisplayMemberBinding="{Binding Path=ProductName}"  
                                Width="auto" />
            </GridView>
        </ListView.View>

答案 1 :(得分:3)

您可以使用

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}} 

找到你上面的特定控件

答案 2 :(得分:2)

好吧,因为您处于DataTemplate的上下文中,您无法通过TemplatedParent模式访问该媒体资源,至少在您的情况下如此。它指的是应用模板(其中存在数据绑定元素)的元素。 [...] Link我不确定,它可以在DataTemplate中使用,因为我只在ControlTemplates中看过它,但是因为文档没有说出来......

您可以尝试找到Ancestor。 E.g。

<Label Content="{Binding AlternationIndex, 
       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}" ... />

我还没有在DataTemplates中使用,所以没有保修。