Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于我的知识盲区之ItemsSource的分享~

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

作者头像
用户7053485
发布于 2020-06-19 08:39:06
发布于 2020-06-19 08:39:06
1.2K00
代码可运行
举报
文章被收录于专栏:Kitty的日常笔记Kitty的日常笔记
运行总次数:0
代码可运行

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
silverlight:telerik RadControls中RadGridView的一个Bug及解决办法
当RadGridView中嵌套RadComboBox,且RadGridView的高度不够出现滚动条时,上下拉动滚动条后,RadComboBox中的选中值将丢失! 如下图: 滚动条未拖动前 滚动条上下拖
菩提树下的杨过
2018/01/24
7920
silverlight:telerik RadControls中RadGridView的一个Bug及解决办法
C# WPF数据绑定方法以及重写数据模板后数据绑定
本文将会介绍WPF如何实现前后端数据绑定和在进行数据绑定时常用的方法和类以及对于DataGrid、ListView这样的控件重写数据模板后控件如何进行数据绑定。
郑子铭
2023/08/29
9290
C# WPF数据绑定方法以及重写数据模板后数据绑定
【愚公系列】2023年10月 WPF控件专题 DataGrid控件详解
WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。
愚公搬代码
2023/10/12
1.4K0
WPF 数据绑定实例一
原理:监听事件机制,界面改变有TextChanged之类的事件,所以改变界面可以同步修改到对象
zls365
2021/02/26
8870
C# WPF控件ComboBoxEdit数据绑定及模糊匹配
C#纯小白票友,求一个WPF的combobox自动完成。就是在文本框输入字符(包括中文),下拉框的自动过滤出符合条件的项目列表?
zls365
2021/12/06
2K0
C# WPF控件ComboBoxEdit数据绑定及模糊匹配
Silverlight数据绑定/IValueConverter学习笔记
先回忆一下aspx中的处理: 在aspx中,可以直接在后台定义一个变量,然后前台就可以用<%=xxx%>来将其"绑定"html控件上,比如下面这样,实在是很方便: using System; namespace WebApplication1 { public partial class _Default : System.Web.UI.Page     { protected string _Test = DateTime.Now.ToString(); protected void Page_
菩提树下的杨过
2018/01/23
9710
【编辑】解决 Wpf TabControl 在所有选项卡上仅创建一个视图 的问题
原标题:Wpf TabControl create only one view at all tabs(https://stackoverflow.com/questions/43347266/wpf-tabcontrol-create-only-one-view-at-all-tabs)
独立观察员
2024/11/23
1720
【编辑】解决 Wpf TabControl 在所有选项卡上仅创建一个视图 的问题
WPF 已知问题 在 ObservableCollection 的 CollectionChanged 修改集合内容将让 UI 显示错误
本文记录一个 WPF 已知问题,在 ObservableCollection 的 CollectionChanged 事件里面,绕过 ObservableCollection 的异常判断逻辑,强行修改集合内容,修改之后的 UI 层将不能符合预期。本文将告诉大家此问题的复现方法和修复方法
林德熙
2023/04/07
2.8K0
WPF 已知问题 在 ObservableCollection 的 CollectionChanged 修改集合内容将让 UI 显示错误
WPF之TreeList的实现方法(一)
做项目的时候根据需求,WPF现有的控件不能完全满足我们的需求, 很多时候我们需要对现有的控件做一下加工。 最简单的我们可能会把Tree转换成List形式有的叫Grid形式就像下图一样 今天我先做一个完
lpxxn
2018/01/31
2.1K0
WPF之TreeList的实现方法(一)
UWP ListView数据绑定
在制作UWP个人项目时需要用到数据绑定,网上的教程大都不全,特此记录下自己使用的方法。
DearXuan
2022/01/19
1.5K0
UWP ListView数据绑定
C# ObservableCollection和List的区别
1)ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged
zls365
2021/02/26
2K0
9张图,32个案例带你轻松玩转Java stream
Java8 中增加了 Stream 处理,可以配合 Lambda 表达式来使用,让操作集合非常便利。虽然我们平时经常使用 Stream,但用到的方法其实非常少,这篇文章就来完整的介绍 Stream 的使用。
jinjunzhu
2022/09/23
6520
9张图,32个案例带你轻松玩转Java stream
WPF 列表控件数据源绑定多个数据集合方法
在 WPF 用的多的列表控件如 ListBox 或 ListView 等,本文告诉大家在这些列表控件上进行绑定多个数据集合来源的多个实现方法。如有一个显示动物列表的控件,需要绑定的数据来源是阿猫和阿狗两个 ObservableCollection 列表,不在后台代码编写合并集合的代码情况下,可以通过 XAML 的编写,绑定多个数据集合
林德熙
2021/05/27
3.7K0
《深入浅出WPF》学习笔记之深入浅出话Binding
  如果把Binding比作数据的桥梁,那么它的两端分别是Binding的源(Source)和目标(Target)。一般源是逻辑层对象,目标是UI层控件对象.
zls365
2021/02/26
5.8K0
win10 uwp 如何使用DataTemplate 转换绑定Event到Command绑定 ObservableCollectionDataTemplate 绑定 ViewM
这是数据模板,一般用在数组的绑定,显示数组中的元素。 假如我们有一个列表,列表里是书,包括书名、作者、还有出版,那么我们只有源信息,如何把它显示到我们的ListView,就需要DataTemplate。 使用很简单,我们可以定义在资源,也可以定义在ItemTemplate。 数据模板有绑定的问题。 我们使用Binding和WPF其实没有多少不同,在Mode只有OneWay,OneTime,TwoWay。我们使用的x:bind在DataTemplate才和原来有一些不同。 我们使用x:bind需要我们对我们数据的类型,这个在前没有,我开始不知,弄了好久,最后才知道,还有一个,UWP默认是OneTime,也就是绑定只有一次。
林德熙
2018/09/18
2.8K0
WPF Binding学习(四) 绑定各种数据源
在这里我们使用了ListView控件和GridView控件来显示数据,这两个控件从表面来看应该属于同一级别的控件。实际上并非如此!ListView是ListBox的派生类,而GridView是ViewBase的派生类,ListView中的View是一个ViewBase对象,所以,GridView可以做为ListView的View来使用而不能当作独立的控件来使用。这里使用理念是组合模式,即ListView由一个View,但是至于是GridVIew还是其它类型的View,由程序员自己选择。其次,GridView的内容属性是Columns,这个属性是GridViewColumnCollection类型对象。因为XAML支持对内容属性的简写,可以省略<GridView.Columns>这层标签,直接在GridView内部定义<GridViewColumn>对象,GridViewColumn中最重要的一个属性是DisplayBinding(类型是BindingBase),使用这个属性可以指定这一列使用什么样的Binding去关联数据-----这与ListBox有些不同,ListBox使用的是DisplayMemberPath属性(类型是String)。如果想用更复杂的结构来表示这一标题或数据,则可为GridViewColumn设置Head Template和Cell Template,它们的类型都是DataTemplate
莫问今朝
2018/08/31
4.5K0
WPF Binding学习(四)      绑定各种数据源
WPF 多线程下跨线程处理 ObservableCollection 数据
本文告诉大家几个不同的方法在 WPF 里,使用多线程修改或创建 ObservableCollection 列表的数据
林德熙
2022/08/12
4.1K0
【我们一起写框架】MVVM的WPF框架(三)—数据控件
这世上,没人能一次性写出完美无缺的框架;因为,任何一个框架都需要项目的淬炼,然后才能升华,趋近完美。
Kiba518
2018/09/28
2.5K0
【我们一起写框架】MVVM的WPF框架(三)—数据控件
WPF 做一个超级简单的 1024 数字接龙游戏
游戏的规则十分简单,那就是有多个列表。程序会给出一个数字,玩家决定数字放在哪个列表里面。如果放入列表里面的数字和列表里面最后一个数字相同,那两个数字将会叠加进行合并,合并两个 1024 将会自动清理掉整个列表
林德熙
2024/06/24
1250
WPF 做一个超级简单的 1024 数字接龙游戏
WPF中非递归(无后台代码)动态实现TreeView
在UI界面中,树形视图是比较常用的表示层级结构的方式,WPF中提供了TreeView控件。对于TreeView控件的基本使用已经有很多文章。大都是介绍如何在XAML中使用硬编码的固定信息填充Treeview控件,或者是后台代码递归遍历数据源,动态创建TreeView。这里我想介绍一下如何只通过XAML标记,不用一行后台代码遍历数据实现TreeView。
czwy
2023/10/22
4600
WPF中非递归(无后台代码)动态实现TreeView
推荐阅读
相关推荐
silverlight:telerik RadControls中RadGridView的一个Bug及解决办法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验