• 热门专题

WPF 中双向绑定通知机制之ObservableCollection使用

作者:一天两天三天  发布日期:2015-03-26 20:14:09
Tag标签:双向  机制  
  •  msdn中   ObservableCollection<T> 类    表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。

    在许多情况下,所使用的数据是对象的集合。 例如,数据绑定中的一个常见方案是使用 ItemsControl(如 ListBox、ListView 或 TreeView)来显示记录的集合。

    可以枚举实现 IEnumerable 接口的任何集合。 但是,若要设置动态绑定,以便集合中的插入或删除操作可以自动更新 UI,则该集合必须实现 INotifyCollectionChanged 接口。 此接口公开 CollectionChanged 事件,只要基础集合发生更改,都应该引发该事件。

    WPF 提供 ObservableCollection<T> 类,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现。

    还有许多情况,我们所使用的数据只是单纯的字段或者属性,此时我们需要为这些字段或属性实现INotifyPropertyChanged接口,实现了该接口,只要字段或属性的发生了改变,就会提供通知机制。

    ObservableCollection<T>实现

    前台xmal

    <Window x:Class='WpfApplication1.WindowObservable'
            xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
            xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
            Title='Window8' Height='356' Width='471'>
        <Grid>
            <StackPanel Height='295' HorizontalAlignment='Left' Margin='10,10,0,0' Name='stackPanel1' VerticalAlignment='Top' Width='427'>
                <TextBlock Height='23' Name='textBlock1' Text='学员编号:' />
                <TextBox Height='23' Name='txtStudentId' Width='301' HorizontalAlignment='Left'/>
                <TextBlock Height='23' Name='textBlock2' Text='学员列表:' />
                <ListBox Height='156' Name='lbStudent' Width='305' HorizontalAlignment='Left'>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Name='stackPanel2' Orientation='Horizontal'>
                                <TextBlock  Text='{Binding Id,Mode=TwoWay}' Margin='5' Background='Beige'/>
                                <TextBlock Text='{Binding Name,Mode=TwoWay}' Margin='5'/>
                                <TextBlock  Text='{Binding Age,Mode=TwoWay}' Margin='5'/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <Button Content='Button' Height='23' Name='button1' Width='75' HorizontalAlignment='Left' Click='button1_Click' />
            </StackPanel>
        </Grid>
    </Window>

    后台cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    
    namespace WpfApplication1
    {
        public partial class WindowObservable : Window
        {
            ObservableCollection<Students> infos = new ObservableCollection<Students>() { 
                new Students(){ Id=1, Age=11, Name='Tom'},
                new Students(){ Id=2, Age=12, Name='Darren'},
                new Students(){ Id=3, Age=13, Name='Jacky'},
                new Students(){ Id=4, Age=14, Name='Andy'}
                };
    
            public WindowObservable()
            {
                InitializeComponent();
    
                this.lbStudent.ItemsSource = infos;
    
                this.txtStudentId.SetBinding(TextBox.TextProperty, new Binding('SelectedItem.Id') { Source = lbStudent });
            }
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                infos[1] = new Students() { Id = 4, Age = 14, Name = '这是一个集合改变' };
                infos[2].Name = '这是一个属性改变';
            }
    
            public class Students
            {
                public int Id { get; set; }
                public string Name { get; set; }
                public int Age { get; set; }
            }    
        }
    }

    在这个例子中我们将Students数据对象用ObservableCollection<T>来修饰。这样当我们点击click的时候我们看到。当我们点击后只有student整个对象的改变引发了后台通知机制。

    INotifyPropertyChanged实现

    INotifyPropertyChanged会向客户端发出某一属性值已更改的通知。当元素属性值改变时,会通知后台model

    前台代码不变,我们让后台Students  Model实现INotifyPropertyChanged接口。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    
    namespace WpfApplication1
    {
        public partial class WindowObservable : Window
        {
            ObservableCollection<Students> infos = new ObservableCollection<Students>() { 
                new Students(){ Id=1, Age=11, Name='Tom'},
                new Students(){ Id=2, Age=12, Name='Darren'},
                new Students(){ Id=3, Age=13, Name='Jacky'},
                new Students(){ Id=4, Age=14, Name='Andy'}
                };
    
            public WindowObservable()
            {
                InitializeComponent();
    
                this.lbStudent.ItemsSource = infos;
    
                this.txtStudentId.SetBinding(TextBox.TextProperty, new Binding('SelectedItem.Id') { Source = lbStudent });
            }
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                infos[1] = new Students() { Id = 4, Age = 14, Name = '这是一个集合改变' };
                infos[2].Name = '这是一个属性改变';
            }
            public class Students : INotifyPropertyChanged
            {
                string _name;
                public int Id { get; set; }
                public string Name
                {
                    get { return _name; }
                    set { _name = value; OnPropertyChanged('Name'); }
                }
                public int Age { get; set; }
                protected internal virtual void OnPropertyChanged(string propertyName)
                {
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
                public event PropertyChangedEventHandler PropertyChanged;
            }
        }
    }

    此时我们再 运行代码会发现

    不管是集合还是对象都发生了改变。至此。我们的整个后台通知就能完美监视任何对象变动。

    代码参考:http://blog.csdn.net/fwj380891124/article/details/8194190

    本文地址:http://www.cnblogs.com/santian/p/4366832.html

    博客地址:http://www.cnblogs.com/santian/

    转载请以超链接形式标明文章原始出处。
About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规