首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在wpf中从子网格跨度访问子值

在wpf中从子网格跨度访问子值
EN

Stack Overflow用户
提问于 2011-12-24 16:53:52
回答 1查看 482关注 0票数 0

请告诉我如何访问C#中的子项

代码语言:javascript
运行
复制
<Grid Width="562" Height="300" HorizontalAlignment="left" VerticalAlignment="Top" Name="parentgrid">
        <Grid.Resources>
            <DataTemplate x:Key="phara">
                <Grid x:Name="Pharamacygrid">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="30"></RowDefinition>
                        <RowDefinition Height="30"></RowDefinition>
                        <RowDefinition Height="30"></RowDefinition></Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="115*"></ColumnDefinition>
                        <ColumnDefinition Width="447*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
 <Label Content="Name:" Grid.Row="0" Grid.Column="0" Height="28" HorizontalAlignment="Left"  Name="lblName" Visibility="Visible" />
                    <ComboBox Height="23"   Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left"  Name="Cmb_Name" Visibility="Visible" Width="120" DataContext="{StaticResource clientPharamcy}" ItemsSource="{Binding}" DisplayMemberPath="pharmacyName" SelectedValuePath="pharmacyName" SelectionChanged="Cmb_Name_SelectionChanged">  
                                 </ComboBox>
                    <Label Content="Address:" Grid.Row="1" Grid.Column="0" Height="28" HorizontalAlignment="Left"  Name="lblAddress" Visibility="Visible" />
                    <TextBox Height="23" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"  Name="txtAddress" Visibility="Visible" Width="120" />
                    <Label Content="AdditionalAddress:" Grid.Row="2" Grid.Column="0" Height="28" HorizontalAlignment="Left"  Name="lblAdditionaladdr" Visibility="Visible" />
                    <TextBox Height="23" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left"  Name="txtAdditionAddress" Visibility="Visible" Width="120" />
  </Grid> </DataTemplate>
        </Grid.Resources>  
    <telerik:RadDataForm AutoGenerateFields="False" Name="datform"
                         ReadOnlyTemplate="{StaticResource phara}"
                         EditTemplate="{StaticResource phara}" telerik:StyleManager.Theme="Office_Black"
                         CommandButtonsVisibility="Cancel,Commit,Edit" EditEnded="datform_EditEnded" Margin="0,0,0,-82" />            
        </Grid>

在这里我想在C#中访问Cmb_NametxtAddresstxtAdditionAddress,但它们不能在C#中访问,因为它们是在内部网格中,所以请告诉我如何访问内部网格

EN

回答 1

Stack Overflow用户

发布于 2011-12-24 20:59:19

你的DataTemplate将被放大,然后添加到'datform‘的可视化树中。因此,您可以通过使用VisualTreeHelper类递归搜索可视化树来查找这些元素。

概念验证代码:

代码语言:javascript
运行
复制
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        // Find all TextBox  visual children named "txtAddress" starting with the datform control
        var txtAddressMatches = GetVisualChildWithName("txtAddress", datform).OfType<TextBox>();

        // Fina all ComboBox visual children named "Cm_Name" starting with the datform control
        var Cmb_NameMatches = GetVisualChildWithName("Cm_Name", datform).OfType<ComboBox>();
    }

    private IEnumerable<FrameworkElement> GetVisualChildWithName(string name, FrameworkElement element)
    {
        return GetVisualChildWithName(name, element, new List<FrameworkElement>());
    }

    private IEnumerable<FrameworkElement> GetVisualChildWithName(string name, FrameworkElement element, IEnumerable<FrameworkElement> matches) 
    {
        if (element == null)
        {
            return matches;
        }

        if (element.Name == name)
        {
            matches = matches.Concat(new []{element});
        }

        for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            matches = matches.Concat(GetVisualChildWithName(name, VisualTreeHelper.GetChild(element, i) as FrameworkElement, new List<FrameworkElement>()));
        }

        return matches;
    }

VisualTreeHelper类具有静态方法,允许您发现给定项目的所有子项和父项关系(以及其他内容)。更多信息可以在这里找到:

MSDN on VisualTreeHelper

请记住,当遍历可视化树时,不能保证找到唯一的名称,因此在上面的示例代码中,我返回了一个匹配列表。例如,如果我们将DataTemplate中的命名元素应用于ItemsControl中的每个项目,就会发生这种情况。如果我们开始在ItemsControl上搜索可视化树,我们将在模板中为每个容器项(例如ListBoxItem)发现一次命名项。

修改上面的代码以获得搜索深度将是微不足道的,但希望您能理解:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8623633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档