绑定到 ItemsControl 中 ItemsControl 的 AlternationIndex
Bind to AlternationIndex of ItemsControl in ItemsControl
考虑以下 XAML
<ItemsControl ItemsSource="{Binding Path=MyItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" AlternationCount="999" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource TemplatedParent},
FallbackValue=FAIL,
StringFormat={}Index is {0}}" />
<ItemsControl ItemsSource="{Binding Path=MySubItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=1}, Path=(ItemsControl.AlternationIndex)}"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
有三个 TextBlock 节点。第一个 TextBlock 是第一个 ItemsControl 的直接子项,并按预期显示 AlternationIndex。但是,我需要更深一层的 AlternationIndex,在第二个 ItemsControl 中。因此我不能使用 TemplatedParent 并认为我可以找到具有 AncestorLevel 的 Ancestor。但是,第二个 ItemsControl 中的两个 TextBlock 节点都显示“0”。
我错过了什么?如何从第二个 ItemsControl 中定位第一个 ItemsControl?
AlternationIndex 不会在 ItemsControl 上,而是在它的每个子控件上。使用 DataTemplate,您的 ItemsControl 会将每个子项存储在一个具有 AlternationIndex 的 ContentPresenter 中。您需要修改的内容:
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
考虑以下 XAML
<ItemsControl ItemsSource="{Binding Path=MyItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" AlternationCount="999" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource TemplatedParent},
FallbackValue=FAIL,
StringFormat={}Index is {0}}" />
<ItemsControl ItemsSource="{Binding Path=MySubItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=1}, Path=(ItemsControl.AlternationIndex)}"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
有三个 TextBlock 节点。第一个 TextBlock 是第一个 ItemsControl 的直接子项,并按预期显示 AlternationIndex。但是,我需要更深一层的 AlternationIndex,在第二个 ItemsControl 中。因此我不能使用 TemplatedParent 并认为我可以找到具有 AncestorLevel 的 Ancestor。但是,第二个 ItemsControl 中的两个 TextBlock 节点都显示“0”。
我错过了什么?如何从第二个 ItemsControl 中定位第一个 ItemsControl?
AlternationIndex 不会在 ItemsControl 上,而是在它的每个子控件上。使用 DataTemplate,您的 ItemsControl 会将每个子项存储在一个具有 AlternationIndex 的 ContentPresenter 中。您需要修改的内容:
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>