我有这个xaml示例:
<ItemsControl MinHeight="150" ItemsSource="{Binding fieldList}" Name="myItemsControl">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Name="canvasFields" MinHeight="150" Background="White" Margin="10" Height="{Binding HauteurCanvas}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left"
Value="{Binding Column}" />
<Setter Property="Canvas.Top"
Value="{Binding Row}" />
<Setter Property="Width"
Value="{Binding Width}" />
<Setter Property="Height"
Value="{Binding Height}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<c:ControlCustomField MouseLeftButtonDown="ControlCustomField_MouseLeftButtonDown" MouseMove="ControlCustomField_MouseMove" MouseLeftButtonUp="ControlCustomField_MouseLeftButtonUp"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我想从后面的代码中访问canvasFields
但是我只能看到myItemsControl。
到目前为止,我尝试了很多东西......在代码背后,没有一个有效:
canvasFields
这是没有看到的。
((Canvas)(myItemsControl.ItemsPanel.Template))
这会产生“无法转换”错误。
myItemsControl.canvasFields
也看不到这一点。
好吧,你看到了这笔交易......我如何从代码背后“看到”canvasField?
我可能错过了一些非常明显的访问权限...
提前致谢!
答案 0 :(得分:1)
您无法访问它!因为它是一个模板。而不是创建的控件。
答案 1 :(得分:0)
您应该查看FrameworkElement.GetTemplateChild
方法,它是为此目的而设计的。但是,这需要您继承ItemsControl
,因为此方法受到保护。
如果您需要避免这种情况,那么您可以使用ItemsControl
方法遍历VisualTreeHelper.GetChild
的可视树,分析元素的类型和Name
属性,直到找到合适的元素
答案 2 :(得分:0)
您需要遍历ItemsControl
的视觉后代,并寻找满足以下条件的Panel
会议:
if (panel.IsItemsHost && panel.TemplatedParent == itemsControl)
/* You've found the ItemsPanel. */;
var itemsPresenter = panel.TemplatedParent as ItemsPresenter;
if (itemsPresenter != null && itemsPresenter.TemplatedParent == itemsControl)
/* You've found the ItemsPanel. */;
它可能不是100%可靠,但它还没有让我失望。