在 header 列中使用文本框 - c# wpf
use textbox in column header - c# wpf
我的列标题中有一个文本框和一个按钮。在我按下按钮之前,文本框应该折叠起来。
问题是我无法以编程方式访问文本框。
我试过 tbTest.Visibility = Visibility.Visible;
但它显示以下错误:
"The name 'tbTest' does not exist in the current context"
我也需要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>
您可以做以下两件事之一,如果您想访问视图模型中的可见性,请创建一个可见性 属性,然后从您的 xaml 绑定到它。或者,您可以在后面的代码 (xaml.cs) 中访问文本框的可见性,其中 tbTest.Visibility 可以工作。
我认为这是标准做法,并且对于访问文本框上的文本同样有效 - 在视图模型上创建一个字符串 属性 并使用与下面类似的代码进行绑定。
Text="{Binding txtBox1String, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
您无法使用其名称访问在数据网格中使用的文本框。
您必须使用以下代码才能在单击按钮时访问文本框。
<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;
}
希望这对您有所帮助。
我的列标题中有一个文本框和一个按钮。在我按下按钮之前,文本框应该折叠起来。 问题是我无法以编程方式访问文本框。
我试过 tbTest.Visibility = Visibility.Visible;
但它显示以下错误:
"The name 'tbTest' does not exist in the current context"
我也需要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>
您可以做以下两件事之一,如果您想访问视图模型中的可见性,请创建一个可见性 属性,然后从您的 xaml 绑定到它。或者,您可以在后面的代码 (xaml.cs) 中访问文本框的可见性,其中 tbTest.Visibility 可以工作。
我认为这是标准做法,并且对于访问文本框上的文本同样有效 - 在视图模型上创建一个字符串 属性 并使用与下面类似的代码进行绑定。
Text="{Binding txtBox1String, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
您无法使用其名称访问在数据网格中使用的文本框。 您必须使用以下代码才能在单击按钮时访问文本框。
<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;
}
希望这对您有所帮助。