You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:06:25