WPF DataGrid обновляет элементы с помощью .Refresh - PullRequest
1 голос
/ 11 августа 2011

Я использую 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 ]

2 голосов
/ 11 августа 2011

Мне не очень понятно, зачем вам вообще обновлять свои вещи.Если вам нужно наблюдать за изменениями в коллекции записей журнала, используйте ObservableCollection<LogEntry>, если вам нужно обновить ячейки, когда что-то в LogEntry изменится, сделайте это наблюдаемым, внедрив INotifyPropertyChanged.Когда вы вызываете Refresh для базового CollectionView, все контейнеры элементов восстанавливаются.И особенно это требует много времени, когда виртуализация отключена.

1 голос
/ 11 августа 2011

Реализация INotifyPropertyChanged в вашей коллекции.

Вместо использования списка используйте ObserverableCollection .

При любом установщике свойств MyLogEntry вызывайте PropertyChangedEventHandler.

C # code (без тестирования) :

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));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...