闲话WPF之二一(WPF中的数据处理 [3])

最近比较忙些,好多天没有写WPF了。今天,我们继续回到前面的话题:WPF中的数据处理。前面讲过,通过实现INotifyPropertyChanged,我们可以改变使任意的CLR对象支持WPF的绑定源。但是,INotifyPropertyChanged通常只应用在单个的类属性上。在现实应用中,我们还会遇到另外一种情况:我们需要监视某一堆的数据是否发生变化。也就是说我们绑定的数据源不再是一个单独数据对象。比如,绑定源是一个数据表时,我们希望在表中任何一条数据发生变化就能得到通知。(这里暂不考虑WPF绑定对ADO.NET的支持。)

WPF提供了一个ObservableCollection类,它实现了一个暴露了INotifyPropertyChanged的数据集合。也就是说我们不需要自己对每个单独的数据实现INotifyPropertyChanged结构。我们先看看如何实现一个简单的绑定数据集合。

namespace NSLYL
{
    public class LYLDataObj
    {
         public LYLDataObj(string name, string description)
        {
            this.name = name;
            this.description = description;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }       

        public string Description
        {
            get { return description; }
            set { description = value; }
        }
       
        private string name;
        private string description;      
    }


    public class LYLDataObjCol : ObservableCollection<LYLDataObj>
    {
        public LYLDataObjCol()
        {
            this.Add(new LYLDataObj("Microsot", "Operating System"));
            this.Add(new LYLDataObj("Google", "Search"));
        }
    }
}

代码很简单,基本上就是这样的一个模板。然后,我们就可以把LYLDataObjCol绑定到一个需要多项数据的Element之上,比如ListBox、ComboBox等等。

<ListBox ItemsSource="{StaticResource dataObj}" .../>

绑定之后,只要我的LYLDataObjCol对象发送了变化,ListBox、ComboBox的数据也会有对应的变化。

到现在,我们已经知道在绑定的时候有两种指定数据源的方式:1、DataContext,关于它我们在这个Post有简单介绍。2、直接用Binding类的Source属性。那么,我们在使用的时候如何区别呢?首先,Source的优先级比DataContext高,只有Source不存在,或者在当前Source到不到需要的属性时才会查找DataContext。除此之外,这两者没有真正的区别,只是建议使用Source,它能有助于我们调试应用程序。因为通过它可以明确的得到Source的信息。而DataContext支持一种继承。可以在父Element指定Source源。这同时也成为了DataContext的一个优点:如果多个Element需要绑定同一个Source源,那么我们只需要在一个地方指定DataContext,就可以在其子Element使用。

posted @ 2007-01-10 14:39 Yiling Lai 阅读(3027) 评论(5)  编辑 收藏 网摘 所属分类: WPF

  回复  引用    
#1楼 2007-01-10 16:04 | 虫子[匿名] [未注册用户]
革命先行者.
^_^
  回复  引用  查看    
#2楼 [楼主]2007-01-10 16:15 | Yiling Lai      
@虫子[匿名]

已经不先啦,好多人一直在关注,偶才开始不久啊
  回复  引用    
#3楼 2007-01-17 14:35 | icehyp [未注册用户]
有两个问题:
1) 第一个类"public class LYLDataObj" 是否应写成
"public class LYLDataObj : INotifyPropertyChanged"
2) 我在其它地方应用这个类是只能是集合中增加或减少item时会产生通知事件,而某个item的属性变化时无法得到通知,我的是这样用的
public ObservableCollection<LYLDataObj> lylitem;
"lylitem.CollectionChanged"用这个事件来捕获通知
不知原文所述的方法可以正确得到某个属性改变时的通知
public class LYLDataObjCol : ObservableCollection<LYLDataObj>
{
public LYLDataObjCol()
{
this.Add(new LYLDataObj("Microsot", "Operating System"));
this.Add(new LYLDataObj("Google", "Search"));
}
}

  回复  引用  查看    
#4楼 [楼主]2007-01-17 14:59 | Yiling Lai      
@icehyp

1. 我上面的用法没有问题。你混合使用了两种不同的情况。一种针对属性的通知,一种针对集合元素变化(这里的元素变化只能是增加、减少或者列表被刷新)的通知

2. 注意,我这里的实现的需求是“我们希望在表中任何一条数据发生变化就能得到通知”。它只能对集合中增加或减少item时会产生通知事件。

3. 你的功能可以尝试自己实现INotifyPropertyChanged。请参考http://www.cnblogs.com/YilingLai/archive/2006/12/29/606736.html

4. 另一种实现方法是尝试刷新列表

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: