zoukankan      html  css  js  c++  java
  • [转载]再谈ObservableCollection

    再谈ObservableCollection

    MSDN中说ObservableCollection是一个动态的数据集合,在添加项、移除项或刷新整个列表的时候,此集合将提供通知。我是在WPF中用了这个,但是我在网上找资料的时候发现,有在WinForm中也用到的,我并没有去验证,使用方式应该一样吧,只是WPF中是提供与前台UI界面中的控件进行绑定操作时通知更新的,WinForm中怎么做就不知道了。

    这个,上面MSDN那么说了,但是按照我的理解就是,ObservableCollection数据集中的条目有变动,就出发通知流程,引发更新操作。这是一个泛型类,ObservableCollection<T>的形式,我之前有一个例子,是使用ListBox做柱状图的,里面用到了ObservableCollection,里面提到一个ReptClass类,作为数据基类,ObservableCollection创建数据源,与前台的ListBox进行绑定,显示柱状图。可以参考《WPF-用ListBox做简单的柱状图》,这次还是用柱状图中的类做例子。

    我今天上午一直思考一个问题,就是ObservableCollection集合中的单个条目值改变前台UI会不会更新,按照MSDN上的说法是会自动更新的,但是我试了一下,发现,只有增加条目,删除条目的时候会引发通知,当更改条目总某个值得时候并没有引发通知。

    但是当我设置断点后发现,值确实改变了,只是UI并没有更新,现在的问题是,增加项、删除项,会引发通知;条目值发生变化,未进行通知。

    我以为是我的写法有问题,我又查阅了一下资料,顺便看了一下今年夏天那个项目中我是如何操作的,然后发现了一个不同,就是作为基类的ReptClass,原来的写法是:

    //数据类
    public class ReptClass
    {
    public int count { set; get; }//数量
    public Brush color { set; get; }//颜色
    public string mouth { set; get; }//月份
    public int height { get { return count * 3; } }//高度
    }

    但是,这里需要提到一个接口:INotifyPropertyChanged,MSDN中说他是向客户端发出某一属性已更改的通知。在MVVM框架中也用到了这样的组合方式。

    于是我让上面的类继承此接口:

    //数据类
    public class ReptClass : INotifyPropertyChanged
    {
    private int _count;
    public int count
    {
    set
    {
    _count = value;
    this.Changed("count");
    this.Changed("height");
    }
    get { return _count; }
    }//数量
    public Brush color { set; get; }//颜色
    public string mouth { set; get; }//月份
    public int height
    {
    get { return count * 3; }
    }//高度
    #region 属性更改通知
    public event PropertyChangedEventHandler PropertyChanged;
    private void Changed(string PropertyName)
    {
    if (this.PropertyChanged != null)
    this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }
    #endregion
    }

    通过上面这样的更改,当我再次对条目进行更改的时候,UI就更新了。

    比如,我要为每一项的count都加1,我可以这样写:

    foreach (var item in listboxSource)
    {
    item.count += 1;
    }

    或者进行下面这样的操作

    //移除mouth=十二月的条目
    listboxSource.Remove(listboxSource.FirstOrDefault(t => t.mouth == "十二月"));
    //移除第一个
    listboxSource.RemoveAt(0);
    //移除最后一个
    listboxSource.RemoveAt(listboxSource.Count - 1);
    //将第一个移动到最后
    listboxSource.Move(0, listboxSource.Count - 1);

    做个记录,防止下次用到的时候再忘了。

  • 相关阅读:
    HTML5结构
    HTML5新增的非主体元素header元素、footer元素、hgroup元素、adress元素
    CF GYM 100703G Game of numbers
    CF GYM 100703I Endeavor for perfection
    CF GYM 100703K Word order
    CF GYM 100703L Many questions
    CF GYM 100703M It's complicate
    HDU 5313 Bipartite Graph
    CF 560e Gerald and Giant Chess
    POJ 2479 Maximum sum
  • 原文地址:https://www.cnblogs.com/fx2008/p/2354425.html
Copyright © 2011-2022 走看看