c # Как найти UIElements в RowDetailsTemplate - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно создать UEleleCollection DetailsElement после инициализации UserControl. Моя проблема заключается в FindName. Я не могу понять, как использовать TemplatedParent. Что это за элемент? Как я могу сослаться на это в CB? Поэтому DetailsElements будет содержать все элементы InputField в DataGrid Details.

public partial class Segments
{
    public Segments()
    {
        InitializeComponent();
        // this does not work
        var e = DgSections.FindName("MainPanel",...) as StackPanel;
        DetailsElements = e.Children;
    }

    UIElementCollection DetailsElements; 

    ...


<UserControl
    x:Class="My.Views.MainUserControls.Segments"
.....

<DataGrid
    x:Name="DgSections"
    ....
    <DataGrid.Columns>
     ...
    </DataGrid.Columns>  
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Border Margin="0" Style="{StaticResource DataGridDetailsBorder}">
                <StackPanel
                    x:Name="MainPanel"
                    ...>
                    <muc:InputField
                        x:Name="Length"
                         .../>

                    <muc:InputField
                        x:Name="Diam"
                        ... />   
                    // and more InputFields
                </StackPanel>
            </Border>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>
   ....     

1 Ответ

0 голосов
/ 07 ноября 2019

Как уже упоминалось в комментарии, к моменту создания Segments элемент Border не создается. Он загружается и отображается по требованию.

Что вы можете сделать, это обработать событие Loaded Border и программно установить свойства InputFields:

private void SomeButton_Click(object sender, RoutedEventArgs e)
{
    Border border = (Border)sender;
    StackPanel stackPanel = (StackPanel)border.Child;
    foreach (InputField inputField in stackPanel.Children.OfType<InputField>())
    {
        //...
    }
}

XAML:

<Border Margin="0" Style="{StaticResource DataGridDetailsBorder}" Loaded="OnLoaded">
...