0

在初始化 UserControl 之后,我需要构建 UIElementCollection DetailsElement。我的问题在于 FindName。我不知道如何使用 TemplatedParent。那是哪个元素?我如何在 CB 中引用它?因此,DetailsElements 将包含 DataGrid 详细信息中的所有 InputField 元素。

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>
   ....     
4

1 回答 1

1

如评论中所述,Border创建时间没有创建元素Segments。它是按需加载和渲染的。

您可以做的是处理 的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">
于 2019-11-07T14:05:46.303 回答