關於我的知識盲區之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:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "Mike",
                Age = "20",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "Lucy",
                Age = "25",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:[email protected]")
            });
            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:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "lisi",
                Age = "12",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "wangwu",
                Age = "45",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "",
                Age = "11",
                Sex = SexOpt.Male,
                Pass = true,
                Email = new Uri("mailto:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "lisi",
                Age = "12",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:[email protected]")
            });
            memberData.Add(new Member()
            {
                Name = "wangwu",
                Age = "45",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:[email protected]")
            });
        }
    }
    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

 

本文有點混亂,主要是爲了做個筆記

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章