在列标题中使用文本框 - c#wpf

时间:2015-10-27 08:37:54

标签: c# wpf datagrid columnheader

我的列标题中有一个文本框和一个按钮。应该折叠文本框,直到我按下按钮。 问题是我无法以编程方式访问文本框。

我尝试tbTest.Visibility = Visibility.Visible;,但它显示以下错误:

"名称&#t; TbTest'在当前上下文中不存在"

我还需要tbTest.Text,但它不起作用。

这是我的代码:

<DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridColumnHeader">
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <ColumnDefinition Width="*"></ColumnDefinition>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>

                                            <ContentPresenter />


                                            <Label Grid.Column="0" Padding="5 0" Content="Gruppe" VerticalAlignment="Center" Cursor="Hand" Foreground="White"/>

                                            <TextBox x:Name="tbTest" Grid.Column="1" Width="150"  Visibility="Collapsed" TextChanged="tbTest_TextChanged"></TextBox>

                                            <Button Grid.Column="2" x:Name="btnFilterGroup" Style="{StaticResource MyButton}" Width="16" Height="16" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0 0 10 0" Click="btnFilterGroup_Click">
                                                <Button.Background>
                                                    <ImageBrush ImageSource="Resources/filter.png"/>
                                                </Button.Background>
                                            </Button>


                                            <Thumb x:Name="PART_RightHeaderGripper" Grid.Column="3" HorizontalAlignment="Right" Width="2" BorderThickness="0.6" 
                                                   BorderBrush="{Binding VerticalGridLinesBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" Cursor="SizeWE"/>
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>

2 个答案:

答案 0 :(得分:1)

您无法使用其名称访问数据网格内使用的文本框。 您必须使用以下代码才能在按钮单击时访问文本框。

<DataGrid HorizontalAlignment="Left" Margin="28,152,0,0" VerticalAlignment="Top" Height="132" Width="436">
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridColumnHeader">
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <ColumnDefinition Width="*"></ColumnDefinition>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>

                                            <ContentPresenter />


                                            <Label Grid.Column="0" Padding="5 0" Content="Gruppe" VerticalAlignment="Center" Cursor="Hand" Foreground="White"/>

                                            <TextBox x:Name="tbTest" Grid.Column="1" Width="150"  Visibility="Hidden" TextChanged="tbTest_TextChanged" Loaded="tbTest_Loaded"></TextBox>

                                            <Button Grid.Column="2" x:Name="btnFilterGroup" Width="16" Height="16" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0 0 10 0" Click="btnFilterGroup_Click">

                                            </Button>


                                            <Thumb x:Name="PART_RightHeaderGripper" Grid.Column="3" HorizontalAlignment="Right" Width="2" BorderThickness="0.6" 
                                                   BorderBrush="{Binding VerticalGridLinesBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" Cursor="SizeWE"/>
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTemplateColumn.HeaderStyle>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="Active"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>

现在,将以下代码添加到文本框的已加载事件中以获取它的实例。

private void tbTest_Loaded(object sender, RoutedEventArgs e)
        {
            tblBox = (sender as TextBox);
        }

最后,将以下代码添加到按钮单击事件以更改文本框的可见性。

private void btnFilterGroup_Click(object sender, RoutedEventArgs e)
        {
            tblBox.Visibility = Visibility.Visible;
        }

希望这有助于您的需求。

答案 1 :(得分:0)

您可以执行以下两项操作之一:如果要在视图模型中访问可见性,请创建可见性属性,然后从xaml绑定到该属性。或者,您可以在后面的代码(xaml.cs)中访问文本框的可见性,其中tbTest.Visibility将起作用。

我相信这是标准做法,并且在访问文本框上的文本方面也同样有效 - 在视图模型上创建一个字符串属性,并使用类似的代码绑定到下面。

Text="{Binding txtBox1String, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"