WPF DataGrid使用.Refresh更新项目

时间:2011-08-11 10:14:44

标签: wpf layout datagrid

我正在使用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>

2 个答案:

答案 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));
        }
    }
}