zoukankan      html  css  js  c++  java
  • 关于我的知识盲区之ItemsSource的分享~

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

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

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

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

    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> 类

    定义

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

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

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

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

     

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

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

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

     

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

     

  • 相关阅读:
    Kotlin协程第一个示例剖析及Kotlin线程使用技巧
    大数据JavaWeb之java基础巩固----Junit&反射&注解
    Kotlin协程重要概念详解【纯理论】
    Kotlin反射在属性上的应用实战
    Kotlin反射操纵构造方法与伴生对象
    个人任务day4
    典型用户和用户场景
    个人任务Day3
    个人任务2
    个人任务1
  • 原文地址:https://www.cnblogs.com/guhuazhen/p/12613081.html
Copyright © 2011-2022 走看看