получить доступ к дочерним значениям из дочерних сеток в wpf - PullRequest
0 голосов
/ 24 декабря 2011

Пожалуйста, помогите мне, как получить доступ к дочерним элементам в C #

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

Здесь я хочу получить доступ Cmb_Name, txtAddress, txtAdditionAddress в C #, но они не доступны в C #, как ониво внутренней сетке, пожалуйста, скажите мне, как получить доступ к внутренней сетке

1 Ответ

0 голосов
/ 24 декабря 2011

Ваш DataTemplate будет накачен, а затем добавлен в визуальное дерево 'datform'.Таким образом, вы можете найти эти элементы путем рекурсивного поиска в визуальном дереве с использованием класса VisualTreeHelper.

Код доказательства концепции:

    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 на VisualTreeHelper

Имейте в виду, что при обходе дерева визуалов нет гарантии нахождения уникальных имен, поэтому в примереКод выше, я возвращаю список совпадений.Это может произойти, например, если бы мы назвали элементы в DataTemplate, применяемые к каждому элементу в ItemsControl.Если бы мы начали поиск визуального дерева в ItemsControl, мы бы обнаружили именованные элементы в шаблоне один раз для каждого элемента контейнера (например, ListBoxItem).

Изменение кода выше, чтобы иметь глубину поиска, было бы тривиально, но, надеюсь, вы поняли:)

...