为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
动漫人物 2021-05-10 09:21:41
我有一个WPF应用程序,其中UI具有一个列表框。列表框具有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;    }}
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以创建自己的大小受限的可观察集合类。这样的事情应该可以帮助您入门:


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

        }

    }

}

当然,您可能必须公开更多方法,但是我希望这足以使您理解。


查看完整回答
反对 回复 2021-05-23
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

可以通过此类轻松完成:


public class LimitedSizeObservableCollection<T> : ObservableCollection<T>

{

    public int Capacity { get; }


    public LimitedSizeObservableCollection(int capacity)

    {

        Capacity = capacity;

    }


    public new void Add(T item)

    {

        if (Count >= Capacity)

        {

            this.RemoveAt(0);

        }

        base.Add(item);

    }

}


查看完整回答
反对 回复 2021-05-23
  • 3 回答
  • 0 关注
  • 551 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信