请告诉我如何访问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>在这里我想在C#中访问Cmb_Name、txtAddress、txtAdditionAddress,但它们不能在C#中访问,因为它们是在内部网格中,所以请告诉我如何访问内部网格
发布于 2011-12-24 20:59:19
你的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
请记住,当遍历可视化树时,不能保证找到唯一的名称,因此在上面的示例代码中,我返回了一个匹配列表。例如,如果我们将DataTemplate中的命名元素应用于ItemsControl中的每个项目,就会发生这种情况。如果我们开始在ItemsControl上搜索可视化树,我们将在模板中为每个容器项(例如ListBoxItem)发现一次命名项。
修改上面的代码以获得搜索深度将是微不足道的,但希望您能理解:)
https://stackoverflow.com/questions/8623633
复制相似问题