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
元素。它是按需加载和呈现的。
您可以做的是处理Border
的Loaded
事件并以编程方式设置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中的上下文菜单项?