嵌套ItemControls -绑定到上层控件

本文关键字:控件 绑定 ItemControls 嵌套 | 更新日期: 2023-09-27 18:10:03

我有一个集合,其中包含一个集合本身。现在我想在wpf中浏览两个集合。我试图将第二个集合的颜色属性绑定到第一个集合的依赖属性。但直到现在,我还没有找到合适的方法来绑定它。在可见性绑定的情况下,我找到了一个解决办法,即在第二个ItemsPanelTemplate中将画布布局的可见性属性绑定到所需的属性。

下面这段代码代表了我的情况:

<ItemsControl x:Name="Itemcntrl10" ItemsSource="{Binding Collection1}" >
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <ItemsControl x:Name="Itemcntrl12" ItemsSource="{Binding Collection2}"  > 
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Canvas Visibility="{Binding Visibility, Converter={StaticResource BooleanToVisibilityConverter}}" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                            <Line X1="{Binding X}" Y1="{Binding Y}" 
                                                  X2="{Binding old.X}" Y2="{Binding old.Y}" 
                                                  StrokeThickness="{Binding Path=DataContext.StrokeThickness, ElementName=ThisMainWindow}" 
                                                   >
                                            <Line.Stroke>
                                                <SolidColorBrush  Color="Black" />
                                            </Line.Stroke>
                                        </Line>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

有什么办法可以解决这个问题吗?我想ElementBinding到上部的ItemsControl,但这并没有解决我的问题。

嵌套ItemControls -绑定到上层控件

您可以使用RelativeSource绑定来访问VisualTree中更上层的项

例如

Color="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, 
                Path=DataContext.SomeColorProperty}"

这应该在VisualTree中查找最接近的Canvas对象,这将是Itemcntrl12中使用的对象,并且它将绑定到它的DataContext,这应该是您的第一个ItemsControl中的数据项。

如果你想进入另一个层次,绑定到第一个ItemsControl (Itemcntrl10)的属性,你可以使用绑定的AncestorLevel属性来指定第二个画布,而不是第一个。