首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何创建Generic StateManagedCollection?

创建Generic StateManagedCollection的方法如下:

  1. 定义StateManagedCollection类:
代码语言:csharp
复制
public class StateManagedCollection<T> : IList<T>, INotifyPropertyChanged, INotifyCollectionChanged
{
    private readonly IList<T> _internalList;

    public StateManagedCollection()
    {
        _internalList = new List<T>();
    }

    public StateManagedCollection(IEnumerable<T> items)
    {
        _internalList = new List<T>(items);
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public T this[int index]
    {
        get => _internalList[index];
        set
        {
            _internalList[index] = value;
            OnPropertyChanged(new PropertyChangedEventArgs(nameof(Item[])));
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, index));
        }
    }

    public int Count => _internalList.Count;

    public bool IsReadOnly => _internalList.IsReadOnly;

    public void Add(T item)
    {
        _internalList.Add(item);
        OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, _internalList.IndexOf(item)));
    }

    public void Clear()
    {
        _internalList.Clear();
        OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public bool Contains(T item)
    {
        return _internalList.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        _internalList.CopyTo(array, arrayIndex);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _internalList.GetEnumerator();
    }

    public int IndexOf(T item)
    {
        return _internalList.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        _internalList.Insert(index, item);
        OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));
    }

    public bool Remove(T item)
    {
        var index = _internalList.IndexOf(item);
        var result = _internalList.Remove(item);
        if (result)
        {
            OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));
        }

        return result;
    }

    public void RemoveAt(int index)
    {
        var item = _internalList[index];
        _internalList.RemoveAt(index);
        OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _internalList.GetEnumerator();
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChanged?.Invoke(this, e);
    }

    protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        CollectionChanged?.Invoke(this, e);
    }
}
  1. 使用StateManagedCollection:
代码语言:csharp
复制
var collection = new StateManagedCollection<string>();
collection.Add("Hello");
collection.Add("World");
foreach (var item in collection)
{
    Console.WriteLine(item);
}

在这个例子中,我们创建了一个StateManagedCollection类,它实现了IList<T>接口,并且通过INotifyPropertyChanged和INotifyCollectionChanged接口来通知数据的变化。我们可以使用这个类来管理我们的数据,并且在数据发生变化时自动通知UI进行更新。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Unity动画☀️六、Humanoid和Generic的区别、导入方式(骨骼映射、Avatar创建)

我们可以看到下图,将Boulder 1 骨骼设置为None模式,Project下,Boulder 1下仅有一个网格PolyBoulder01 Legacy:老版本动画系统 Generic:...通用模式 Humanoid:人形动画 Generic与Humanoid动画的区别 Generic: 它是新的动画系统,支持非人形(怪物)动画,也支持人形动画。...选择Generic或者Humanoid后,系统都自动为Perfab模型生成Avatar。...Hierarchy里面同理 3、可在Preview里设置运动范围 4、应用你做的设置 Apply—Done 骨骼映射 是将模型里的骨骼节点映射到Unity自带的骨骼模型上 Scene里白色、绿色骨骼为我们(美术)创建的骨骼...,Mapping(映射)里面为Unity自带骨骼,我们创建的骨骼要映射到Unity自带的骨骼上 Hierarchy里面每个节点都与Scene模型一一对应,我们做的骨骼可能做得比Unity自带的多,也可能少

48510

如何创建Vim Dotfile?

如何创建Vim-Dotfile? 可以参考以下步骤: 1. 首先,你要检查一下.vimrc文件是否存在。要确定这个文件是否可用,可以运行以下命令。 2....要手动创建.vimrc文件,在你的Linux/Unix终端运行以下代码。 3. 当创建文件后,现在我们可以继续通过一些例子来看一下如何使用.vimrc文件。...所以如果你想在你的工作环境中添加配置以及在这个过程中创建dotfile的话,你得学习Vimscript。 4. 下面,让我们来看一些Vim dotfiles配置的例子。...学习如何结合Vim定制dotfile对你目前和将来的项目会有很大帮助。对于那些刚开始学习Vim和dotfiles整体理念的人来说 ,可能会觉得Vim有点可怕。你可以多去一些学习编程的网站看看。...要想了解更多有关创建Vim Dotfile的技巧、工具、插件和资源等实用知识,可以浏览以下参考资料。

1.9K80
  • 如何创建数字孪生

    哪种技术可以创建数字孪生?创建数字孪生需要多长时间?如何创建数字孪生每当我们谈论虚拟世界时,“数字孪生”这个词就会一再出现。它协助企业跟踪和升级产品设计。...总的来说,人们正在谈论它的作用以及它将如何彻底改变未来的世界。但是很多人需要了解什么是数字双胞胎。什么是数字孪生?数字孪生基本上是虚拟世界中任何物理系统或对象的复制品。...此外,从(2022-2029),复合年增长率预计约为 40.6%如何创建数字孪生?创建数字孪生是一个复杂的过程,涉及严格的工作流程。构建任何物理上存在的对象的副本需要做很多事情。...为了简化一切,以下步骤在数字孪生创建过程中起着至关重要的作用。创建布局第一步是制定一个蓝图,其中包括需要开发的数字孪生类别。...它定义了关于他们的能力将如何展开以及他们的所有权和管理安排的价值和可重用性因素。精心设计了一个完整的蓝图,以便构建同卵双胞胎的每一个标准都能成功。在构建数字孪生的基础之前,需要遵循一份清单。

    2.1K30

    plsqldeveloper怎么创建表_如何创建表格

    2、右边会弹出一个窗口,我们以可视化方式来创建一个Table。如下图所示,在“一般”选项卡中,所有者:选择能查询该表的用户名;输入“名称”即表名;其他的可以默认,也可以手动设置。...4、在“键”选项卡中创建表的主键,这个是必须有的。 5、在“索引”选项卡中创建表的索引,索引类型众多,我们根据自己需要来创建,最后点击窗口中的“应用”按钮即可。...6、我们可以点击右下角的“查看SQL”,查看到创建表时的SQL语句。...7、我们创建好表后,我们可以打开SQL窗口用SQL语句查询出来 8、在SQL窗口中写查询刚才创建的表的SQL语句,然后点击左上角的齿轮(或者F8键)执行SQL语句 9、我们可以SQL语句对该表进行增删查改

    6.6K20

    如何用DBeaver创建表?

    偶然发现好多大佬在使用免费的DBeaver社区版,就也下载了最新的7.2.2,添加数据库也很顺利,查询也很6,But没有找到创建表的入口: 找遍菜单也没有找到,真是感觉一万个草泥马在奔腾。...心累 dbeaver-ce-7.2.2-macos.dmg不能创建表 把这个情况反馈给大佬,大佬没回。...郁闷 上网搜下,看到人家的界面是这样的 大佬有空后,发来创建表的截图是这样的: 版本不一样!!! 降版本 目前使用的IDE是IDEA,没有办法使用eclipse插件。...看到网上有人使用5.0.4可以创建表,就下载了dbeaver-ce-5.0.5-macos.dmg 5.0.5:有tables,可以创建表的。...DML操作: 小结 DBeaver Community Edition 7.2.2也是支持创建表及对表进行DML操作的。

    3.1K20

    Spring 如何创建 bean 对象?

    前情回顾 前文「Spring 如何从 IoC 容器中获取对象?」从整体上分析了如何从 Spring IoC 容器获取一个 bean 对象。...本文进一步深入细节,主要分析如何创建 singleton(单例)类型的对象。 如何创建单例对象? 从流程图可以看出,当获取一个 bean 对象时,Spring 会首先尝试从缓存中获取单例对象。...下面主要分析单例对象是如何创建、并放入缓存中的。...创建成功后,会把该对象存入缓存。 创建的逻辑在哪呢?...本文在前文的基础上又进一步细化,主要从整体上探讨了 Spring 如何创建单例的 bean 对象,整体上分为三个步骤: 创建 bean 对象 填充 bean 属性 初始化 bean 对象 至于这三个步骤具体又做了什么

    1K20

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券