前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于我的知识盲区之ItemsSource的分享~

关于我的知识盲区之ItemsSource的分享~

作者头像
用户7053485
发布2020-06-19 16:39:06
1.1K0
发布2020-06-19 16:39:06
举报
文章被收录于专栏:Kitty的日常笔记Kitty的日常笔记

一、为何说它是知识盲区呢

1、首先很多人应该都和我一样知道itemsSource,在 Windows 应用程序中很多控件都提供了 DataSource 属性,并将 DataSet 或 DataTable 的值直接赋给该属性,这样在控件中即可显示从数据库中查询出来的数据。 常用的数据绑定控件有文本框(TextBox)、标签(Label)、列表框(ListBox)、组合框(ComboBox)、数据表格(DataGridView)等。

2、以前我只知道如何去使用控件绑定数据,显示数据值。当数据源发生改变时重新绑定数据源,初始化数据。

下面有一个例子,我们可以看到,初始化界面的时候,数据绑定了一次(mygard.ItemsSource),当点击按钮的时候,itemsource的值就发生改变了,这个是为什么呢?

代码语言:javascript
复制
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.Navigation;
using System.Windows.Shapes;

namespace testControl
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        public List<Member> memberData = new List<Member>();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
            memberData.Add(new Member()
            {
                Name = "Joe",
                Age = "23",
                Sex = SexOpt.Male,
                Pass = true,
                Email = new Uri("mailto:Joe@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "Mike",
                Age = "20",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:Mike@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "Lucy",
                Age = "25",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:Lucy@school.com")
            });
            mygard.ItemsSource = memberData;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            memberData.Add(new Member()
            {
                Name = "zhang",
                Age = "11",
                Sex = SexOpt.Male,
                Pass = true,
                Email = new Uri("mailto:Joe@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "lisi",
                Age = "12",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:Mike@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "wangwu",
                Age = "45",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:Lucy@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "",
                Age = "11",
                Sex = SexOpt.Male,
                Pass = true,
                Email = new Uri("mailto:Joe@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "lisi",
                Age = "12",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:Mike@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "wangwu",
                Age = "45",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:Lucy@school.com")
            });
        }
    }
    public enum SexOpt { Male, Female };

    public class Member
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public SexOpt Sex { get; set; }
        public bool Pass { get; set; }
        public Uri Email { get; set; }
    }
}

三、附上微软的官方解读

其实呢,最最主要的还是因为这个

ObservableCollection<T> 类

定义

命名空间:System.Collections.ObjectModel程序集:System.dll

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

在许多情况下,您使用的数据是对象的集合。 例如,数据绑定中的常见方案是使用 ListBoxListViewTreeViewItemsControl 来显示记录集合。

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

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

在实现自己的集合之前,请考虑使用 ObservableCollection<T> 或某个现有的集合类,如 List<T>Collection<T>BindingList<T>,等等。 如果你有高级方案,并且想要实现自己的集合,请考虑使用 IList,它提供了可按索引单独访问的对象的非泛型集合。 实现 IList提供与数据绑定引擎的最佳性能。

若要完全支持将数据值从绑定源对象传输到绑定目标,则集合中支持可绑定属性的每个对象都必须实现相应的属性更改通知机制,例如 INotifyPropertyChanged 接口

这些都是微软的解读,我就不亲自解读了hhh

本文有点混乱,主要是为了做个笔记

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ObservableCollection<T> 类
    • 定义
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档