c# - .net c# 限制 observablecollection 中的条目数

标签 c# data-binding observablecollection

我有一个 WPF 应用程序,其中 UI 有一个列表框。列表框绑定(bind)了 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>

View 模型:

    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;
    }

最佳答案

您可以创建自己的大小受限的可观察集合类。像这样的事情应该让你开始:

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

当然,您可能需要公开更多的方法,但我希望这足以让您理解。

关于c# - .net c# 限制 observablecollection 中的条目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121550/

相关文章:

c# - 从托管 DLL 调用时非托管 Dll 中出现 StackOverflow 异常

c# - 如何编写一个将字符串列表作为参数的函数

c# - 与不可见网格的 Irrlich 碰撞

WPF数据绑定(bind)文本框到另一个对象中的整数属性

c# - 主细节 MVVM WPF 不工作

c# - 带有列标题的 gridview 的 View 模型 c#

c# - WinForm 窗体的新实例

wpf - BindingExpression 生成的值对目标无效

c# - 过滤 ObservableCollection?

c# - 将 ObservableCollection 过滤到多个列表框