无法访问后面代码中列表框内的按钮

时间:2020-05-27 18:32:56

标签: c# wpf listbox datatemplate

我在WPF应用程序的列表框中有一个文本框和一个按钮。现在,我有一种情况,例如,当我单击按钮时,文本块需要处于编辑模式,而按钮需要处于隐藏状态。一旦用户完成编辑(在文本框上调用了keyup事件),则按钮必须处于可见模式。 我正在按钮上调用click事件并将其隐藏,现在我必须访问click event函数内的文本框才能使其处于可编辑模式(只读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 个答案:

答案 0 :(得分:1)

如果您知道视觉树的结构,则可以使用父级和子级属性对其进行导航:

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属性对于面板有意义,控件具有内容,装饰器(如Border)具有Child属性