2011-12-24 12 views
0

にgridspanels C#のアクセス子供値WPF

<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#でアクセスされませんインナーグリッド内にあるので、内部グリッドにアクセスする方法を教えてください

答えて

0

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

は、それゆえのコード例では、ビジュアルツリーを歩いているとき、一意の名前を見つけることの保証がないことに注意してください。これは、たとえば、ItemsControlの各項目にDataTemplateという名前の要素が適用されている場合に発生します。 ItemsControlのビジュアルツリーの検索を開始した場合は、テンプレート内の指定されたアイテムがコンテナアイテムごとに1回ずつ見つかります(例:ListBoxItem)。

上記のコードを変更して検索の深さを確認するのは簡単ですが、うまくいけばそのアイデアを得ることができます:)

関連する問題