C# WPF数据网格虚拟化丢失单元布局
我有一个自定义样式的datagrid,只有两列。第二列是“DataGridTemplateColumn”,其中的网格还包含一个自定义样式的文本框和一个图像。我在文本框中创建了一个“IsValid”依赖属性,它根据绑定对象的属性值更改其背景颜色和边框笔刷。图像通过DataTrigger根据对象的IsValid属性更改其源 每次用户按下enter键并将对象中的IsValid属性设置为true、false或null时,textbox基本上都会做一些工作(当然,通过对象中的notifypropertychanged,更改会反映在textbox和图像上) 现在我的问题是:如果禁用RowVirtualization,当datagrid中显示很多行时(大约在100到1000之间),垂直滚动会非常慢,但如果我保持打开状态,生成的新行的背景颜色会错误,旧行的布局会丢失 这是DataGrid的xamlC# WPF数据网格虚拟化丢失单元布局,c#,wpf,datagrid,wpfdatagrid,virtualization,C#,Wpf,Datagrid,Wpfdatagrid,Virtualization,我有一个自定义样式的datagrid,只有两列。第二列是“DataGridTemplateColumn”,其中的网格还包含一个自定义样式的文本框和一个图像。我在文本框中创建了一个“IsValid”依赖属性,它根据绑定对象的属性值更改其背景颜色和边框笔刷。图像通过DataTrigger根据对象的IsValid属性更改其源 每次用户按下enter键并将对象中的IsValid属性设置为true、false或null时,textbox基本上都会做一些工作(当然,通过对象中的notifypropertyc
<DataGrid x:Name="dgData"
AutoGenerateColumns="False"
Margin="2"
IsReadOnly="False"
ItemsSource="{Binding}"
SelectionMode="Single"
CanUserAddRows="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
Style="{StaticResource dDataGrid2}"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
MaxHeight="750"
EnableRowVirtualization="False"
SelectionChanged="dgData_SelectionChanged"
Loaded="dgData_Loaded">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}"
BasedOn="{StaticResource dDataGridRow}">
<EventSetter Event="PreviewMouseLeftButtonUp"
Handler="Row_Click" />
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="{Binding Source={x:Static fields:FieldNameList.ProductCode}}"
Binding="{Binding Path=ProductCode}"
Width="auto"
MinWidth="160"
IsReadOnly="True" />
<DataGridTextColumn Header="{Binding Source={x:Static fields:FieldNameList.Product}}"
Binding="{Binding Path=ProductDescription}"
Width="*"
IsReadOnly="True" />
<DataGridTemplateColumn Header="Código SNC"
Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid Name="gridSNCCode">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<txt:DTextBox Grid.Column="0"
x:Name="txtSNCCode"
PreviewKeyUp="txtSNCCode_PreviewKeyUp"
TextChanged="DTextBox_TextChanged"
Text="{Binding Path=PHC_CPOC, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
IsValid="{Binding Path=IsPHC_CPOC_Valid, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
NumericOnly="True"
SelectAllOnFocus="true" />
<Image Grid.Column="1"
Name="imgValidation"
Width="16"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="3 0" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsPHC_CPOC_Valid, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
Value="{x:Null}">
<Setter TargetName="imgValidation"
Property="Visibility"
Value="Collapsed" />
<Setter TargetName="imgValidation"
Property="Source"
Value="{x:Null}" />
<Setter TargetName="gridSNCCode"
Property="ToolTip"
Value="" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsPHC_CPOC_Valid, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
Value="True">
<Setter TargetName="imgValidation"
Property="Visibility"
Value="Visible" />
<Setter TargetName="imgValidation"
Property="Source"
Value="pack://application:,,,/SAFT2PHC;component/Resources/Images/Success48.png" />
<Setter TargetName="gridSNCCode"
Property="ToolTip"
Value="Código SNC Válido" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsPHC_CPOC_Valid, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
Value="False">
<Setter TargetName="imgValidation"
Property="Visibility"
Value="Visible" />
<Setter TargetName="imgValidation"
Property="Source"
Value="pack://application:,,,/SAFT2PHC;component/Resources/Images/delete2-48.png" />
<Setter TargetName="gridSNCCode"
Property="ToolTip"
Value="Código SNC Inválido" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
这是c代码
publicobservableCollections产品{get;set;}
公共MyWindow(列出产品)
{
初始化组件();
此。产品=新的可观察收集(产品);
this.dgddata.ItemsSource=this.Products;
}
如何获得良好的DataGrid性能,同时又不丢失单元格更新布局
我试过使用Items.Refresh()但不起作用
谢谢我冒昧地重新格式化了您的XAML,将每个属性放在一个新行上。需要的水平滚动量太大了。谢谢。。。没有注意到,它确实变得更容易阅读
public ObservableCollections<ProductObj> Products { get; set; }
public MyWindow(List<ProductObj> products)
{
InitializeComponent();
this.Products = new ObservableCollection(products);
this.dgData.ItemsSource = this.Products;
}