.net c # Ограничить количество записей в наблюдаемой коллекции - PullRequest
0 голосов
/ 01 мая 2018

У меня есть приложение WPF, в котором пользовательский интерфейс имеет список. Окно списка имеет привязку ObservableCollection. Класс журнала реализует INotifyPropertyChanged.

В списке будет отображаться непрерывная регистрация приложения. Пока приложение работает. Размер ObservableCollection продолжает расти. Через некоторое время я получаю исключение «Недостаточно памяти». Я хочу показать последние 1000 записей в списке управления. Любые предложения по этому вопросу будут очень полезны!

XAML:

                    <DataGrid AutoGenerateColumns="False" SelectedValue="{Binding SelectedLog}" SelectionUnit="FullRow" SelectionMode="Single" Name="dataGridLogs" 
                      ItemsSource="{Binding Path=LogList}"  CanUserReorderColumns="True" CanUserResizeRows="True" CanUserDeleteRows="False"  IsReadOnly="True"
                      CanUserAddRows="False" EnableColumnVirtualization="True" EnableRowVirtualization="True" SelectionChanged="grid_SelectionChanged"> 
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Time Stamp" Binding="{Binding StrTimeStamp, Mode=OneWay}" Width="Auto"/>
                    <DataGridTextColumn Header="Action" Binding="{Binding Action, Mode=OneWay}" Width="Auto"/>

            </DataGrid>

ViewModel:

    public ObservableCollection<LogData> LogList
    {
        get
        {
            if (logList == null)
            {
                logList = new ObservableCollection<LogData>();
            }
            return logList;
        }
        set
        {
            logList = value;
            OnPropertyChanged("LogList");
        }
    }

Модель:

     public class LogData : INotifyPropertyChanged
{
    public LogData()
    {
    }
    private String timestamp = string.Empty;
    public String StrTimestamp
    {
        get
        {
            if (timestamp == null)
                return string.Empty;
            return timestamp ;
        }
        set
        {

            timestamp = value;
        }
    }
    public string Action
    {
       get;set;
    }

}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете создать свой собственный коллекционный класс с ограниченным размером. Как-то так должно начаться:

public class LimitedSizeObservableCollection<T> : INotifyCollectionChanged
{        
    private ObservableCollection<T> _collection;
    private bool _ignoreChange;

    public LimitedSizeObservableCollection(int capacity)
    {
        Capacity = capacity;
        _ignoreChange = false;
        _collection = new ObservableCollection<T>();
        _collection.CollectionChanged += _collection_CollectionChanged;
    }

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public int Capacity {get;}

    public void Add(T item)
    {
        if(_collection.Count = Capacity)
        {
            _ignoreChange = true;
            _collection.RemoveAt(0);
            _ignoreChange = false;
        }
        _collection.Add(item);

    }

    private void _collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if(!_ignoreChange)
        {
            CollectionChanged?.Invoke(this, e);
        }
    }
}

Конечно, вам, вероятно, придется раскрыть еще несколько методов, но я надеюсь, что этого достаточно, чтобы вы поняли идею.

0 голосов
/ 01 мая 2018

Если вы хотите, чтобы это не добавляло в коллекцию более 1000, вы можете сделать это.

public ObservableCollection<LogData> LogList
{
    get
    {
        if (logList == null)
        {
            logList = new ObservableCollection<LogData>();
        }
        return logList;
    }
    set
    {
        if(LogList.Count < 1001)
        {
          logList = value;
          OnPropertyChanged("LogList");
        }
    }
}

или вы можете удалить старые записи при добавлении новых более 1000

public ObservableCollection<LogData> LogList
{
    get
    {
        if (logList == null)
        {
            logList = new ObservableCollection<LogData>();
        }
        return logList;
    }
    set
    {
        if(LogList.Count < 1001)
        {
          logList = value;
          OnPropertyChanged("LogList");
        }
        else 
        {
           LogList.RemoveAt(0);
           logList = value;
           OnPropertyChanged("LogList");
        }
    }
}
...