Как получить контроль от ItemTemplate в ItemsControl?

В My View есть коллекция UserControls (определенная в ItemTontlate ItemsControl), и я хочу получить ссылки на них.

я использую ItemContainerGenerator.ContainerFromIndex, но это возвращается ContentPresenterв то время как я должен был бы получить свой тип UserControl, PlotterColetaCanalUnico, Как мне это сделать?

Xaml:

        <ItemsControl x:Name="plotter" ItemsSource="{Binding Sinais}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="1" IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border x:Name="upper_light_border" BorderThickness="1,0,0,0" BorderBrush="#FFE5E5E5" SnapsToDevicePixels="True">
                        <Border x:Name="lower_dark_border" BorderThickness="0,0,0,1" BorderBrush="#FF1A1A1A" SnapsToDevicePixels="True">
                            <local:PlotterColetaCanalUnico/>
                        </Border>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

Код позади:

    IEnumerable<PlotterColetaCanalUnico> SubPlotters 
    {
        get
        {
            var plotters = new List<PlotterColetaCanalUnico>();

            for(int i = 0; i < plotter.Items.Count; i++)
            {
                var container = (UIElement)plotter
                                 .ItemContainerGenerator
                                 .ContainerFromIndex(i);

                // "container" ends up being ContentPresenter,
                // so the following cast does not work!
                var subPlotter = container as PlotterColetaCanalUnico;

                if (subPlotter != null)
                {
                    plotters.Add(subPlotter);
                }
            }

            return plotters;
        }
    }

Я получил его на работу на основе принятого ответа и следующих изменений:

Xaml - добавил имя в элемент управления пользователя:

<local:PlotterColetaCanalUnico x:Name="plotterCanal"/>

Код позади - искал UserControl напрямую (не прибегая к VisualTreeHelper, как подсказывает ответ):

                if (container == null)
                    continue;

                var template = container.ContentTemplate;
                var subPlotter = template.FindName("plotterCanal", container) as PlotterColetaCanalÚnico;

1 ответ

Решение

Вам нужно еще немного покопаться в визуальном дереве, чтобы найти свой контроль

if (container != null)
{
    var template = container.ContentTemplate;
    var border = template.FindName("upper_light_border", container) as Border;
    // From here, use VisualTreeHelper.GetChild to dig down in to the visual tree and find your control.

}

Вы можете использовать этот ответ здесь, чтобы создать вспомогательный метод для обхода дерева: /questions/2343240/kak-ya-mogu-najti-elementyi-upravleniya-wpf-po-imeni-ili-tipu/2343250#2343250

Другие вопросы по тегам