关于C#中WPF中使用ObservableCollection绑定XamDataGrid的问题

XamDataGrid绑定了一个ObservableCollection,我想让XamDataGrid的某一行的值发生改变时,将这一行传给另一个List,怎么办?(尽量详细,有代码)

这里建议你使用Binding来处理。

了解下ObservableCollection<T> 类和BindingList<T> 类。


ObservableCollection<T> ç±»

表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。

具体说明参考MSDN文档:http://msdn.microsoft.com/zh-cn/library/vstudio/ms668604(v=vs.100).aspx


BindingList<T> ç±»

提供支持数据绑定的泛型集合。BindingList<T> 类可以用作基类以创建双向数据绑定机制。

具体说明参考MSDN文档:http://msdn.microsoft.com/zh-cn/library/vstudio/ms132679(v=vs.100).aspx


两个都是支持双向绑定的,ObservableCollection<T>实现了 INotifyCollectionChanged 接口的数据集合的内置实现,还提供了CollectionChanged事件,在数据集的变更上提供的解决方法多一点。

看一下BindingList<T>,注意protected override void OnListChanged(ListChangedEventArgs e)的这个方法,可以重写这个方法实现强大的功能。


下面写一个自己的MyBindingList<T> 类来实现你所需要的功能。

public class MyBindingList<T> : BindingList<T>
        {
            public List<T> ModeList { get; set; }

            public MyBindingList()
                : base()
            {
                ModeList = new List<T>();
            }

            public MyBindingList(IList<T> list)
                : base(list)
            {
                ModeList = new List<T>();
            }

            protected override void OnListChanged(ListChangedEventArgs e)
            {
                base.OnListChanged(e);

                if (e.ListChangedType == ListChangedType.ItemChanged)
                {
                    ModeList.Add(this.Items[e.NewIndex]);
                }
            }
        }

 å®Œæ•´çš„源代码看下附件。


要触发OnListChanged(),类需要继承INotifyPropertyChanged并触发值更改消息。

代码如下:

public class Student : INotifyPropertyChanged
        {
            private string _Id;

            public string Id
            {
                get { return _Id; }
                set
                {
                    _Id = value;
                    NotifyPropertyChanged("Id");
                }
            }
            private string _Name;

            public string Name
            {
                get { return _Name; }
                set
                {
                    _Name = value;
                    NotifyPropertyChanged("Name");
                }
            }

            public event PropertyChangedEventHandler PropertyChanged;

            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
        }

在MyBindingList里面添加ModeList属性,记录修改的记录,访问该属性就能获得修改的项。


看下是不是你需要的结果,如有疑问,可以继续回复。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-23
你好,ObservableCollection 不会通知 单个实体的变化,除非你在单独实体上实现INotifyPropertyChanged接口,就是的你Itemssource里的实体,需要实现INotifyPropertyChanged通知接口,即可,不知这样说你理解么?追问

具体怎么办呢?能给个示例的代码吗?我是个初学者

第2个回答  2014-01-23
ObservableCollection<你的类> list = new ObservableCollection<你的类>();
其中你的类应该实现INotifyPropertyChanged接口,这样,当某一行的属性发生变化时就会得到PropertyChanged的事件通知。追问

具体怎么办呢?能给个示例的代码吗?我是个初学者

相似回答