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

XamDataGrid绑定了一个ObservableCollection,我想让XamDataGrid的某一行的值发生改变时,将这一行传给另一个List,怎么办?(尽量详... XamDataGrid绑定了一个ObservableCollection,我想让XamDataGrid的某一行的值发生改变时,将这一行传给另一个List,怎么办?(尽量详细,有代码) 展开
 我来答
FoolRabbit编程
推荐于2016-04-21 · 知道合伙人数码行家
FoolRabbit编程
知道合伙人数码行家
采纳数:619 获赞数:3805
毕业于苏州大学,4年编程经验,对WPF有研究。

向TA提问 私信TA
展开全部

这里建议你使用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属性,记录修改的记录,访问该属性就能获得修改的项。


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

代号XY
2014-01-23
知道答主
回答量:28
采纳率:0%
帮助的人:15.1万
展开全部
你好,ObservableCollection 不会通知 单个实体的变化,除非你在单独实体上实现INotifyPropertyChanged接口,就是的你Itemssource里的实体,需要实现INotifyPropertyChanged通知接口,即可,不知这样说你理解么?
追问
具体怎么办呢?能给个示例的代码吗?我是个初学者
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
khlerc
2014-01-23 · TA获得超过420个赞
知道小有建树答主
回答量:485
采纳率:0%
帮助的人:267万
展开全部
ObservableCollection<你的类> list = new ObservableCollection<你的类>();
其中你的类应该实现INotifyPropertyChanged接口,这样,当某一行的属性发生变化时就会得到PropertyChanged的事件通知。
追问
具体怎么办呢?能给个示例的代码吗?我是个初学者
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式