Контроль доступа внутри таблицы данных - PullRequest
3 голосов
/ 03 июня 2011

Это 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 ]

2 голосов
/ 03 июня 2011

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

Однако вы можете упростить его, используя 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 в случаях, когда запрос является более сложным.Я думаю, что ваш подход в порядке!

0 голосов
/ 03 июня 2011

Помимо прочего вы можете добавить ссылку на него в 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;
    //...
}
...