Контроль доступа внутри таблицы данных

Это XAML:

 <Window.Resources>
        <DataTemplate x:Key="Temp">                        
            <DockPanel Width="Auto" Background="White" LastChildFill="False">
                <TextBox Name="txtBox" TextWrapping="Wrap" DockPanel.Dock="Left" Text="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=Content}" Height="20" Width="100"/>
                <StackPanel Orientation="Vertical">
                    <RadioButton Content="Option1" HorizontalAlignment="Left" Height="16" Width="112" Click="RadioButton_Click" />
                </StackPanel>
            </DockPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ContentControl  ContentTemplate="{DynamicResource Temp}" Content="1"/>
    </Grid>

Это код позади:

private void RadioButton_Click(object sender, RoutedEventArgs e)
{
     StackPanel sp = ((RadioButton)sender).Parent as StackPanel;
     DockPanel dp = sp.Parent as DockPanel;
     TextBox txtbox = dp.FindName("txtBox") as TextBox;

     MessageBox.Show(txtbox.Text);
}

Есть ли более простой способ получить доступ к текстовому полю? (Как я знаю, я не могу получить Parent от родителя, например, Parent.Parent...)

2 ответа

Решение

Ваш код не так уж сложен!

Тем не менее, вы можете упростить это, используя Linq-to-VisualTree:

private void RadioButton_Click(object sender, RoutedEventArgs e)
{
     RadioButton rb = sender as RadioButton;
     TextBox txtbox= rb.Ancestors<DockPanel>().First().Elements<TextBox>().First() as TextBox;
     MessageBox.Show(txtbox.Text);
}

Приведенный выше запрос Linq находит первый DockPanel предок твой RadioButton (т.е. Parent.Parent что ты хотел!), то находит первый TextBox дитя DockPanel,

Тем не менее, я обычно использую Linq-to-VisualTree в тех случаях, когда запрос является более сложным. Я думаю, что ваш подход в порядке!

Среди прочего вы можете добавить ссылку на него в RadioButton.Tag:

<RadioButton Content="Option1" HorizontalAlignment="Left" Height="16" Width="112"
        Click="RadioButton_Click" Tag="{x:Reference txtBox}" />
private void RadioButton_Click(object sender, RoutedEventArgs e)
{
    var textBox = (sender as FrameworkElement).Tag as TextBox;
    //...
}
Другие вопросы по тегам