簡體   English   中英

WPF將文本框的寬度綁定到列表框中的網格列

[英]WPF Binding TextBox width to grid column within a list box

我正在嘗試構建一個簡單的(就設計而言)屏幕,該屏幕將允許用戶輸入多行數據。

屏幕的格式為4列( TextBoxTextBoxComboBoxTextBox ),並動態添加新行。

我最初嘗試了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM