Невозможно получить доступ к кнопке внутри списка в коде позади - PullRequest
0 голосов
/ 27 мая 2020

У меня есть текстовое поле и кнопка внутри списка в приложении WPF. Теперь у меня есть сценарий, например, когда я нажимаю кнопку, текстовый блок должен находиться в режиме редактирования, а кнопка - в скрытом состоянии. После того, как пользователь завершит редактирование (в текстовом поле вызывается событие нажатия клавиши), кнопка должна быть в видимом режиме. Я вызываю событие щелчка на кнопке и делаю его скрытым, теперь мне нужно получить доступ к текстовому полю внутри функции события щелчка, чтобы сделать его в редактируемом режиме (только для чтения false). Таким же образом, когда я закончу редактирование, мне нужно вызвать кнопку внутри обработчика событий Keyup текстового поля, чтобы сделать кнопку видимой. Но я не получаю элементы управления в коде. Я знал, что привязка DataTemplate представления списка вызывает эту проблему. Итак, чтобы сделать кнопку видимой, я выполнил следующий код, и он работает.

private void controlEdit_Click_1(object sender, RoutedEventArgs e)
    {
        var edtBtn = sender as Button;
        if (edtBtn != null)
        {
            edtBtn.Visibility = Visibility.Hidden;
        }

    }

Но я не знаю, как вызвать эту кнопку внутри своего текстового поля Обработчик событий Keyup, точно так же, как текстовое поле внутри обработчик события нажатия этой кнопки. Мой список XAML и обработчик событий KeyUp добавляются.

XAML

 <ListBox x:Name="ElList" Height="auto" Width="300" Background="Transparent" DataContext="{Binding collec}" ItemsSource="{Binding collec}"  Grid.Row="0" Margin="31 3" HorizontalAlignment="Left">
            <ListBox.ItemTemplate>
                <DataTemplate>

                    <StackPanel Orientation="Horizontal">

                                    <TextBox x:Name="controltext" Width="153.7" Height="24.4" BorderBrush="#ffffff" FontFamily= "{StaticResource MontserratMedium}"  Padding="2 0 0 0 " Text="{Binding ElName, Mode=TwoWay}" VerticalAlignment="Center" IsReadOnly="False" KeyDown="controltext_KeyDown" KeyUp="controltext_KeyUp" LostKeyboardFocus="controltext_LostKeyboardFocus"/>
                                    <Button x:Name="controlEdit" Style="{StaticResource ImageButtonStyle}" Margin="3 0 0 0 " Click="controlEdit_Click_1">
                                        <Image x:Name="featherImg"  Source="Resources\feather_edit-3.png"  Height="11" Width="11"/>
                                    </Button>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Обработчик события TextBox KeyUp

 private void controltext_KeyUp(object sender, KeyEventArgs e)
    {
        string NewName = ((System.Windows.Controls.TextBox)sender).Text;
        //Make the button visble.
    }

Итак, предложите мне способ доступа к текстовое поле внутри обработчика события нажатия кнопки и так же, как кнопка внутри текстового поля KeyUp.

1 Ответ

1 голос
/ 27 мая 2020

если вы знаете структуру визуального дерева, по нему можно перемещаться, используя свойства Parent и Children:

private void controltext_KeyUp(object sender, KeyEventArgs e)
{
  var textbox = (TextBox)sender;
  var panel = (StackPanel)textbox.Parent;
  var button = panel.Children.OfType<Button>().FirstOrDefault(b => b.Name == "controlEdit");
}

Свойство Children имеет значение для панелей, элементы управления имеют содержимое, декораторы (например, границы) имеют Дочернее свойство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...