我正在使用datagridview将自己的项目显示为List(Of MyStuff)
,并且它的工作安静得很好。当我的班级更改内容时,DataGrid不会更改。我需要DataGrid1.Items.Refresh
,这些项目将成为更新。
但是现在我的列表包含700个项目,而.Refresh
方法只需要15秒,因为一个项目已更改。我搜索了任何“UpdateContent”或“RowUpdate”或“RefreshRow”但没有找到任何内容。如何更新单行的正确方法?
Private LCommand As New List(Of MyLogEntry)
Me.dgv.DataContext = Me.LCommand
Me._LastUpdate = DateTime.MinValue
Me._CurrentIndex = -1
Call UpdateDgv()
Private Sub UpdateDgv()
Application.Current.Dispatcher.Invoke(AsyncRefresh)
End Sub
Private Sub RefreshDgvAsync()
Try
Me.dgv.SelectedIndex = Me._CurrentIndex
Me.dgv.ScrollIntoView(Me.dgv.SelectedItem)
Catch ex As Exception
End Try
If DateTime.Now.Subtract(Me._LastUpdate).TotalSeconds > 60 Then Me.dgv.Items.Refresh()
Me._LastUpdate = DateTime.Now
End Sub
<DataGrid x:Name="dgv" Grid.Row="1" RowHeight="20" AutoGenerateColumns="False" Grid.Column="1" ItemsSource="{Binding}" CanUserAddRows="False" VerticalScrollBarVisibility="Auto" ClipToBounds="True" GridLinesVisibility="Horizontal">
<DataGrid.Columns>
<DataGridTextColumn Header="N°" Binding="{Binding Index}" Width="SizeToCells" MinWidth="30" IsReadOnly="True" />
<!--<DataGridCheckBoxColumn Header="OK" Binding="{Binding Successfully}" Width="SizeToCells" MinWidth="35" IsReadOnly="True" Visibility="Collapsed" />-->
<DataGridTemplateColumn Header="State" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image x:Name="imgState" Source="{Binding StateImageUrl}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Logentry" Binding="{Binding Title}" Width="SizeToHeader" MinWidth="80" IsReadOnly="True" FontWeight="Bold" />
<DataGridTextColumn Header="Action" Binding="{Binding Description}" Width="SizeToCells" MinWidth="80" IsReadOnly="True" FontSize="12" />
<DataGridCheckBoxColumn Header="Available" Binding="{Binding Necessary}" Width="Auto" MinWidth="35" IsReadOnly="True" />
<DataGridTextColumn Header="Log" Binding="{Binding Log}" Width="*" MinWidth="50" IsReadOnly="False" FontSize="8" Foreground="Gray" />
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:2)
我不清楚为什么你需要刷新你的物品。如果需要观察日志条目集合更改,请使用ObservableCollection<LogEntry>
,如果需要在LogEntry中的某些内容发生更改时更新单元格,请通过实现INotifyPropertyChanged
使其可观察。
在底层CollectionView上调用Refresh时,将重新生成所有项容器。当虚拟化被禁用时,特别需要花费大量时间。
答案 1 :(得分:1)
在您的收藏中实施INotifyPropertyChanged。
而不是让List使用ObserveableCollection&lt; type&gt;。
在MyLogEntry属性的任何setter中调用PropertyChangedEventHandler。
C#代码(无测试):
public class MyLogEntry : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private object _myProperty;
public object MyProperty{
get { return _myProperty; }
set {
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
protected void OnPropertyChanged(string name){
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null){
handler(this, new PropertyChangedEventArgs(name));
}
}
}