如何从代码隐藏中查看ItemControl.ItemsPanel.Template

时间:2014-03-19 14:28:44

标签: c# wpf

我有这个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?

我可能错过了一些非常明显的访问权限...
提前致谢!

3 个答案:

答案 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%可靠,但它还没有让我失望。