一、为何说它是知识盲区呢
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; }
}
}
三、附上微软的官方解读
其实呢,最最主要的还是因为这个
命名空间:System.Collections.ObjectModel程序集:System.dll
表示一个动态数据集合,它可在添加、删除项目或刷新整个列表时提供通知。
在许多情况下,您使用的数据是对象的集合。 例如,数据绑定中的常见方案是使用 ListBox、ListView或 TreeView 等 ItemsControl 来显示记录集合。
可以枚举实现 IEnumerable 接口的任何集合。 但是,若要设置动态绑定,以便集合中的插入或删除操作自动更新 UI,则集合必须实现 INotifyCollectionChanged 接口。 此接口公开 CollectionChanged 事件,即每当基础集合发生更改时应引发的事件。
WPF 提供 ObservableCollection<T> 类,该类是实现 INotifyCollectionChanged 接口的数据集合的内置实现。
在实现自己的集合之前,请考虑使用 ObservableCollection<T> 或某个现有的集合类,如 List<T>、Collection<T>和 BindingList<T>,等等。 如果你有高级方案,并且想要实现自己的集合,请考虑使用 IList,它提供了可按索引单独访问的对象的非泛型集合。 实现 IList提供与数据绑定引擎的最佳性能。
若要完全支持将数据值从绑定源对象传输到绑定目标,则集合中支持可绑定属性的每个对象都必须实现相应的属性更改通知机制,例如 INotifyPropertyChanged 接口
这些都是微软的解读,我就不亲自解读了hhh
本文有点混乱,主要是为了做个笔记
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有