【问题标题】:use textbox in column header - c# wpf在列标题中使用文本框 - c# wpf
【发布时间】:2015-10-27 08:37:54
【问题描述】:

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

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

“当前上下文中不存在名称‘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>

【问题讨论】:

    标签: c# wpf datagrid columnheader


    【解决方案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;
            }
    

    希望这有助于您的需要。

    【讨论】:

      【解决方案2】:

      您可以做以下两件事之一,如果您想访问视图模型中的可见性,请创建一个可见性属性,然后从您的 xaml 绑定到它。或者,您可以在 tbTest.Visibility 可以工作的代码 (xaml.cs) 中访问文本框的可见性。

      我认为这是标准做法,并且对于访问文本框上的文本也同样适用 - 在视图模型上创建一个字符串属性并使用与下面类似的代码进行绑定。

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

      【讨论】:

      • 我必须为每个列标题执行此操作吗?
      • 这取决于你,如果你想访问列标题中输入的信息,我会说是,如果不是,那么你不必这样做,或者如果你只想要信息(比方说)一个按钮单击事件,则无需绑定到视图模型上的属性,因为所有信息都可以从触发事件的 xaml.cs 访问。
      • xaml.cs 是什么意思。我在哪里可以找到它?
      • 它通常在添加新的 wpf 项目时自动创建 - gyazo.com/4432221890273f672d82d47b52f44f39 如果这不是为您自己自动添加的,您可以通过创建一个具有相同名称的新类项目来简单地创建一个(但包括 . xaml.cs) 并使其成为视图的部分类。
      • 在您看来,您还必须在顶部添加类似这样的内容 x:Class="Views.AdminView"
      猜你喜欢
      • 2019-07-16
      • 2021-10-31
      • 2011-04-06
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2021-09-20
      • 2011-05-24
      相关资源
      最近更新 更多