[英]WPF Binding TextBox width to grid column within a list box
我正在嘗試構建一個簡單的(就設計而言)屏幕,該屏幕將允許用戶輸入多行數據。
屏幕的格式為4列( TextBox
, TextBox
, ComboBox
, TextBox
),並動態添加新行。
我最初嘗試了2種方法-一種使用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>
當我在ListBox
選擇一行時,我可以看到對象本身填滿了整個寬度,但是最后一列中的文本框僅擴展為適合內容。
將列定義中的寬度設置為*應該(據我所知)會使列擴展以填充可用空間,而將textbox
上的HorizontalAlignment
屬性設置為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的內容保持對齊。 向您的ListBoxItem樣式中添加用於HorizontalContentAlignment
設置器:
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="ContentTemplate">
...
</Setter>
</Style>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.