嵌套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,但这并没有解决我的问题。
您可以使用RelativeSource
绑定来访问VisualTree中更上层的项
例如
Color="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}},
Path=DataContext.SomeColorProperty}"
这应该在VisualTree中查找最接近的Canvas
对象,这将是Itemcntrl12
中使用的对象,并且它将绑定到它的DataContext
,这应该是您的第一个ItemsControl
中的数据项。
如果你想进入另一个层次,绑定到第一个ItemsControl
(Itemcntrl10
)的属性,你可以使用绑定的AncestorLevel
属性来指定第二个画布,而不是第一个。