WPF 将文本框宽度绑定到列表框中的网格列
WPF Binding TextBox width to grid column within a list box
我正在尝试构建一个简单的(在设计方面)屏幕,允许用户输入多行数据。
屏幕格式为 4 列(TextBox
、TextBox
、ComboBox
、TextBox
),并动态添加新行。
我最初尝试了两种方法 - 一种使用 DataGrid
,一种使用 ListView
。
DataGrid
导致很多令人头疼的问题,当它们被单击时项目会保留焦点,ListView
使我无法始终如一地访问底层单元格,而是返回绑定的数据对象由行表示。
我目前的方法使用一个代表一行的自定义组件,包含 3 个 TextBox
个对象和一个 ComboBox
个对象。
这些对象中的一个或多个显示在 ListBox
。
这种方法允许更一致地处理事件,但在视觉上不太容易开始工作。
目前,当显示一行时,grid
中的前 3 列(具有明确定义的 width
)显示正常,但最后一列中的 textbox
不会展开以填充可用宽度。
面板相关代码:
<DockPanel LastChildFill="True" Name="basePanel">
<Grid x:Name="baseGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60" />
<ColumnDefinition Width="60"></ColumnDefinition>
<ColumnDefinition Width="55"></ColumnDefinition>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBox Name="txtYear" Grid.Column="0" Style="{StaticResource txtComponentStyle}" Text="{Binding Path=RatingYear, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Name="txtArrears" Grid.Column="1" Style="{StaticResource txtComponentStyle}" Text="{Binding Path=ArrearsAmount, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox Name="cmbChangeCode" Grid.Column="2" ItemsSource="{Binding Path=ChangeCodes, Mode=OneTime}" SelectedItem="{Binding Path=ChangeCode}" />
<TextBox Name="txtComments" Grid.Column="3" Style="{StaticResource txtComponentStyle}" Text="{Binding Path=Comments, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" />
</Grid>
</DockPanel>
当我 select 在 ListBox
中的一行时,我可以看到对象本身填满了整个宽度,但最后一列中的文本框只会扩展以适合内容。
将列定义中的宽度设置为 * 应该(据我所知)导致列扩展以填充可用的 space,并将 HorizontalAlignment
属性 设置为textbox
到 Stretch 应该会导致文本框填充该列。
下面的代码创建 ListBox
.
<UserControl.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0.5" Margin="1">
<DockPanel LastChildFill="True" HorizontalAlignment="Stretch" Background="DarkSlateBlue">
<Controls:ArrearsListEntry />
</DockPanel>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<DockPanel LastChildFill="True" Background="Red">
<ListBox IsSynchronizedWithCurrentItem="True" Name="lstRowData" ItemsSource="{Binding Path=Rows}" />
</DockPanel>
有没有办法将文本框的宽度绑定到列的实际宽度,或者 属性 会使文本框自动扩展到可用宽度?
ListBoxItem 的内容默认左对齐。将 HorizontalContentAlignment
的 Setter 添加到您的 ListBoxItem 样式:
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="ContentTemplate">
...
</Setter>
</Style>
我正在尝试构建一个简单的(在设计方面)屏幕,允许用户输入多行数据。
屏幕格式为 4 列(TextBox
、TextBox
、ComboBox
、TextBox
),并动态添加新行。
我最初尝试了两种方法 - 一种使用 DataGrid
,一种使用 ListView
。
DataGrid
导致很多令人头疼的问题,当它们被单击时项目会保留焦点,ListView
使我无法始终如一地访问底层单元格,而是返回绑定的数据对象由行表示。
我目前的方法使用一个代表一行的自定义组件,包含 3 个 TextBox
个对象和一个 ComboBox
个对象。
这些对象中的一个或多个显示在 ListBox
。
这种方法允许更一致地处理事件,但在视觉上不太容易开始工作。
目前,当显示一行时,grid
中的前 3 列(具有明确定义的 width
)显示正常,但最后一列中的 textbox
不会展开以填充可用宽度。
面板相关代码:
<DockPanel LastChildFill="True" Name="basePanel">
<Grid x:Name="baseGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60" />
<ColumnDefinition Width="60"></ColumnDefinition>
<ColumnDefinition Width="55"></ColumnDefinition>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBox Name="txtYear" Grid.Column="0" Style="{StaticResource txtComponentStyle}" Text="{Binding Path=RatingYear, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Name="txtArrears" Grid.Column="1" Style="{StaticResource txtComponentStyle}" Text="{Binding Path=ArrearsAmount, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox Name="cmbChangeCode" Grid.Column="2" ItemsSource="{Binding Path=ChangeCodes, Mode=OneTime}" SelectedItem="{Binding Path=ChangeCode}" />
<TextBox Name="txtComments" Grid.Column="3" Style="{StaticResource txtComponentStyle}" Text="{Binding Path=Comments, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" />
</Grid>
</DockPanel>
当我 select 在 ListBox
中的一行时,我可以看到对象本身填满了整个宽度,但最后一列中的文本框只会扩展以适合内容。
将列定义中的宽度设置为 * 应该(据我所知)导致列扩展以填充可用的 space,并将 HorizontalAlignment
属性 设置为textbox
到 Stretch 应该会导致文本框填充该列。
下面的代码创建 ListBox
.
<UserControl.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0.5" Margin="1">
<DockPanel LastChildFill="True" HorizontalAlignment="Stretch" Background="DarkSlateBlue">
<Controls:ArrearsListEntry />
</DockPanel>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<DockPanel LastChildFill="True" Background="Red">
<ListBox IsSynchronizedWithCurrentItem="True" Name="lstRowData" ItemsSource="{Binding Path=Rows}" />
</DockPanel>
有没有办法将文本框的宽度绑定到列的实际宽度,或者 属性 会使文本框自动扩展到可用宽度?
ListBoxItem 的内容默认左对齐。将 HorizontalContentAlignment
的 Setter 添加到您的 ListBoxItem 样式:
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="ContentTemplate">
...
</Setter>
</Style>