WPF:ListView列内TextBox与行交替色一致的实现及绑定错误解决
WPF ListView行交替背景色与内部TextBox背景同步问题
我在WPF项目中使用的ListView,每列包含一个TextBox用于修改数据。已通过样式DifAlternationColorsLV,根据AlternationIndex为ListView行设置了交替背景色,希望ListView列内的TextBox外观与整行保持一致(即行背景色覆盖TextBox)。
当前显示问题:TextBox保留默认白色背景,行的交替背景色无法覆盖TextBox区域,视觉上TextBox与行背景分离。
设置ListView行交替背景色的样式代码
<Style x:Key="DifAlternationColorsLV" TargetType="{x:Type ListViewItem}"> <Style.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="0"> <Setter Property="Background" Value="#FFB1E4EF"></Setter> </Trigger> <Trigger Property="ItemsControl.AlternationIndex" Value="1"> <Setter Property="Background" Value="#FFD4EBFF"></Setter> </Trigger> </Style.Triggers> </Style>
视图的XAML代码
<Border Grid.Row="1" Grid.Column="0" Margin="10,10,10,10" BorderBrush="#FF474A57" CornerRadius="10,10,10,10" BorderThickness="2,2,2,2" Width="300" MaxHeight="200" Background="White"> <StackPanel Margin="0,0,0,20" Orientation="Vertical"> <StackPanel Grid.Column="0" Grid.RowSpan="1" Grid.Row="1" VerticalAlignment="Top"> <Label HorizontalAlignment="Center" FontWeight="Bold"> Schichten </Label> <ListView x:Name="Shift" MinHeight="150" MaxHeight="150" MinWidth="250" HorizontalContentAlignment="Stretch" HorizontalAlignment="Center" IsSynchronizedWithCurrentItem="True" ItemContainerStyle="{StaticResource DifAlternationColorsLV}" AlternationCount="2" ItemsSource="{Binding UiShiftHModelList, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedLine, UpdateSourceTrigger=PropertyChanged}" d:ItemsSource="{d:SampleData ItemCount=3}"> <ListView.View> <GridView> <GridView.Columns> <GridViewColumn Header="Bezeichnung" Width="Auto"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBox x:Name="Bezeichnung" MinWidth="100" Style="{StaticResource TBoxInListV}" Text="{Binding Bezeichnung, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0"> </TextBox> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Tagmuster" Width="80"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBox x:Name="Tagmuster" MinWidth="80" Background="{Binding ElementName=Shift}" Style="{StaticResource TBoxInListV}" Text="{Binding TagmusterID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0"> </TextBox> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Edit" Width="40"> <GridViewColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" > <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Button x:Name="SaveShiftH" Style="{StaticResource BtnListSave}" Grid.Column="0"> </Button> <Button x:Name="UpdateShiftH" Style="{StaticResource BtnListUpdate}" Grid.Column="0"> </Button> <Button x:Name="DeleteShiftH" Style="{StaticResource BtnListDelete}" Grid.Column="1"> </Button> <Button x:Name="ReopenShiftH" Style="{StaticResource BtnListReopen}" Grid.Column="0"> </Button> </Grid> </StackPanel> <DataTemplate.Triggers> <!--Visibility of the Buttons--> <DataTrigger Binding="{Binding EditModus}" Value="0"> <Setter TargetName="SaveShiftH" Property="Visibility" Value="Visible"/> </DataTrigger> <DataTrigger Binding="{Binding EditModus}" Value="2"> <Setter TargetName="UpdateShiftH" Property="Visibility" Value="Visible"/> </DataTrigger> <DataTrigger Binding="{Binding EditModus}" Value="1"> <Setter TargetName="UpdateShiftH" Property="Visibility" Value="Collapsed"/> </DataTrigger> <DataTrigger Binding="{Binding EditModus}" Value="2"> <Setter TargetName="DeleteShiftH" Property="Visibility" Value="Visible"/> </DataTrigger> <DataTrigger Binding="{Binding EditModus}" Value="1"> <Setter TargetName="DeleteShiftH" Property="Visibility" Value="Collapsed"/> </DataTrigger> <DataTrigger Binding="{Binding EditModus}" Value="1"> <Setter TargetName="ReopenShiftH" Property="Visibility" Value="Visible"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView.Columns> </GridView> </ListView.View> </ListView> </StackPanel> </StackPanel> </Border>
尝试的错误绑定及问题
当我将TextBox的Background绑定修改为Background="{Binding ElementName=Shift}"时,显示效果看似符合预期,但会产生大量绑定错误——原因是该绑定直接指向ListView控件本身,而非控件的Background属性,WPF无法将ListView对象转换为Brush类型,因此抛出类型不匹配的绑定异常。
解决办法
方法一:设置TextBox背景为透明
直接让TextBox背景透明,行的背景色会自动透出来,这是最简单的方案:
<TextBox x:Name="Bezeichnung" MinWidth="100" Style="{StaticResource TBoxInListV}" Text="{Binding Bezeichnung, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Background="Transparent"> </TextBox>
方法二:绑定到父级ListViewItem的Background
通过RelativeSource找到当前TextBox所在的ListViewItem,绑定它的Background属性,确保TextBox背景和行完全同步:
<TextBox x:Name="Bezeichnung" MinWidth="100" Style="{StaticResource TBoxInListV}" Text="{Binding Bezeichnung, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Background="{Binding Background, RelativeSource={RelativeSource AncestorType=ListViewItem}}"> </TextBox>
方法三:在TextBox样式中统一设置绑定
如果所有列表内的TextBox都需要这个效果,直接在TBoxInListV样式中添加Background绑定,避免重复代码:
<Style x:Key="TBoxInListV" TargetType="TextBox"> <!-- 保留原有样式设置 --> <Setter Property="BorderThickness" Value="0"/> <!-- 添加背景绑定 --> <Setter Property="Background" Value="{Binding Background, RelativeSource={RelativeSource AncestorType=ListViewItem}}"/> </Style>
内容的提问来源于stack exchange,提问作者c0nsp1r4cy
相关产品推荐
相关产品推荐

