当超过40个项目时,WPF DataGrid错误显示单元格无效边框的位置

cxfofazt  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(117)

我使用数据网格来显示数据作为一个表和虚拟化数据网格。当项目的总数至少超过40项时,它运行良好。因此,当超过40项并向下滚动时,单元格的边框显示不正确。我使用的是Dotnet core 3.1。
拜托,我已经做了4天了,还是什么都没有。非常感谢!

下面是我的代码:

<DataGrid Grid.Row="1"
          AlternatingRowBackground="White"
          HorizontalGridLinesBrush="#d4d4d4"
          VerticalGridLinesBrush="#d4d4d4"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          CanUserReorderColumns="False"
          CanUserResizeRows="False"
          CanUserSortColumns="False"
          CanUserResizeColumns="False"
          HeadersVisibility="Column"
          ItemsSource="{Binding Datas}"
          SelectionMode="Single"
          SelectionUnit="FullRow"
          ScrollViewer.CanContentScroll="True"   
          EnableRowVirtualization="True"
          VirtualizingPanel.VirtualizationMode="Recycling"
          VirtualizingPanel.ScrollUnit="Pixel"
          RowDetailsVisibilityMode="Visible"
          HorizontalScrollBarVisibility="Disabled">

以下是列标记:

<DataGridTextColumn Width="*"
                    Header="Name"
                    Binding="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnValidationError=True}"
                    EditingElementStyle="{StaticResource CellGotFocus}"
                    ElementStyle="{StaticResource CellLostFocus}"/>
    
    <DataGridTemplateColumn Width="*" 
                            Header="Code">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox ItemsSource="{Binding Source, Source={vm:ReplaceModeSourceProvider}}"
                          SelectedValue="{Binding ReplaceMode,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
                          DisplayMemberPath="Name"
                          SelectedValuePath="Value"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

这里是样式和模板:

<Style x:Key="CellLostFocus" TargetType="{x:Type TextBlock}">
                    <Setter Property="Padding" Value="0,4,0,4"/>
                    <Style.Triggers>
                        <Trigger Property="Validation.HasError" Value="True">
                            <Setter Property="Background" Value="LightPink"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Validation.HasError" Value="True"/>
                                <Condition Property="IsMouseOver" Value="True"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="ToolTip"
                                    Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                                            Path=(Validation.Errors)/ErrorContent}"/>
                            <Setter Property="ToolTip.StaysOpen" Value="True"/>
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
                <Style x:Key="CellGotFocus" TargetType="{x:Type TextBox}">
                    <Setter Property="Padding" Value="0,4,0,4"/>
                    <Style.Triggers>
                        <Trigger Property="Validation.HasError" Value="True">
                            <Setter Property="Background" Value="LightPink"/>
                            <Setter Property="ToolTip"
                                    Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                                            Path=(Validation.Errors)/ErrorContent}"/>
                            <Setter Property="ToolTip.StaysOpen" Value="True"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>

我试着跟随:https://www.codeproject.com/Articles/34405/WPF-Data-Virtualizationhttps://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/listview-and-gridview-data-optimization

nimxete2

nimxete21#

我已经修复了,这个问题是由系统.组件模型.注解引起的
我使用了DataGridTemplateColumn而不是DataGridTextColumn,并通过将ValidationErrorTemplate设置为null来删除默认验证模板。之后,我创建了一个自定义模板,并在发生错误时使用触发器来处理UI。
谢谢你的支持,希望对你有所帮助

<DataGridTemplateColumn 
                    Width="*"
                    Header="Header">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border Name="border" BorderThickness="0.5,0.7,0.7,0.7" Margin="-1,-1,-1,-1" BorderBrush="Transparent">
                                <TextBlock Name="textBlock" 
                                           Style="{StaticResource CellLostFocus}"
                                           Text="{Binding PropertyName,
                                                UpdateSourceTrigger=PropertyChanged,
                                                Mode=TwoWay, 
                                                NotifyOnValidationError=True}"/> 
                            </Border>

                            <DataTemplate.Triggers>
                                <Trigger Property="Validation.HasError" SourceName="textBlock" Value="True">
                                    <Setter Property="BorderBrush" TargetName="border" Value="Red"/>
                                </Trigger>
                            </DataTemplate.Triggers>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding PropertyName,
                                            UpdateSourceTrigger=PropertyChanged,
                                            Mode=TwoWay, 
                                            NotifyOnValidationError=True}" 
                                       Style="{StaticResource CellGotFocus}">
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="Loaded">
                                        <textboxBehavior:TextBoxTakeFocusAction />
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>

相关问题