c# 如何在 RowDetailsTemplate 中找到 UIElements

Posted

技术标签:

【中文标题】c# 如何在 RowDetailsTemplate 中找到 UIElements【英文标题】:c# How to find UIElements in RowDetailsTemplate 【发布时间】:2020-03-04 00:01:45 【问题描述】:

在初始化 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>
   ....     

【问题讨论】:

MainPanel 不存在,直到显示 RowDetails。然后加载 DataTemplate,并创建 StackPanel 和 InputFields。 RowDetails 和 MainPanel 可以有多个实例。请描述获取 MainPanel 的目的,可能有更好的方法来实现它。仅供参考,RowDetails 绑定到与 DataGridRow 相同的 DataContext 好的,那么无法在构造函数中生成列表,必须在显示详细信息时生成。我需要该列表来设置 InputFields 的可见性。它们根据 ComboBox 在 Details 本身中的 SelectedItem 而有所不同。 可见性可以通过绑定来改变 【参考方案1】:

正如评论中提到的,在创建 Segments 时没有创建 Border 元素。它是按需加载和呈现的。

您可以做的是处理BorderLoaded事件并以编程方式设置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">

【讨论】:

以上是关于c# 如何在 RowDetailsTemplate 中找到 UIElements的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 DataGrid.RowDetailsTemplate 中的控件?

TreeListView.RowDetailsTemplate 新的每一行

Caliburn.Micro: 如何将函数绑定到DataGrid的RowDetailsTemplate中的上下文菜单项?

在 RowDetailsTemplate 中隐藏/折叠图像

WPF:DataGrid.RowDetailsTemplate:仅在选择单行时显示详细信息?

如何在代码中定义 DataTemplate?