如何在内容控件中获取元素

2 c# wpf xaml

我需要在内容控件中找到元素:

<ContentControl Content="{Binding YourChoices}" Grid.ColumnSpan="3" x:Name="ccBloodGroup">
                <ContentControl.ContentTemplate>
                    <DataTemplate>
                        <Grid>
                            <ComboBox x:Name="cbBloodGroup" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,160,0,0" VerticalAlignment="Top" Width="331" Height="45">
                                <ComboBoxItem>A+</ComboBoxItem>
                                <ComboBoxItem>A-</ComboBoxItem>
                                <ComboBoxItem>B+</ComboBoxItem>
                                <ComboBoxItem>B-</ComboBoxItem>
                                <ComboBoxItem>O+</ComboBoxItem>
                                <ComboBoxItem>O-</ComboBoxItem>
                                <ComboBoxItem>AB+</ComboBoxItem>
                                <ComboBoxItem>AB-</ComboBoxItem>
                            </ComboBox>
                            <TextBlock x:Name="tb" Text=" Blood Type" IsHitTestVisible="False" Visibility="Hidden" HorizontalAlignment="Left" Margin="10,176,0,0" VerticalAlignment="Top"/>
                        </Grid>
                        <DataTemplate.Triggers>
                            <Trigger SourceName="cbBloodGroup" Property="SelectedItem" Value="{x:Null}">
                                <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                            </Trigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ContentControl.ContentTemplate>
            </ContentControl>
Run Code Online (Sandbox Code Playgroud)

我在互联网上找到了答案

 ComboBox cb = ccBloodGroup.ContentTemplate.FindName("cbBloodGroup", ccBloodGroup) as ComboBox;
Run Code Online (Sandbox Code Playgroud)

但这给了我一个运行时异常,说"此操作仅对应用了此模板的元素有效".

请帮忙..

小智 6

这种方法可以帮助您:

public T FindElementByName<T>(FrameworkElement element, string sChildName) where T : FrameworkElement
    {
            T childElement = null;
            var nChildCount = VisualTreeHelper.GetChildrenCount(element);
            for (int i = 0; i < nChildCount; i++)
            {
                FrameworkElement child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;

                if (child == null)
                    continue;

                if (child is T && child.Name.Equals(sChildName))
                {
                    childElement = (T)child;
                    break;
                }

                childElement = FindElementByName<T>(child, sChildName);

                if (childElement != null)
                    break;
            } 
            return childElement;
    }
Run Code Online (Sandbox Code Playgroud)

而且,我如何使用它,只需添加按钮,然后点击按钮点击:

 private void Button_OnClick(object sender, RoutedEventArgs e)
    {
        var element = FindElementByName<ComboBox>(ccBloodGroup, "cbBloodGroup");
    }
Run Code Online (Sandbox Code Playgroud)