`

wpf学习之ObservableCollection<T>相关知识

 
阅读更多
本篇学习了ObservableCollection<T>相关知识,因为在项目开发中我碰到一些问题,后来发现时我的理解偏差!所以做下笔记!

(一)代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
//添加命名空间
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace CatalogTest
{
    public partial class ObservableCollectionVSList : UserControl
    {
        ObservableCollection<Student> students = new ObservableCollection<Student>();
        //List<Student> students = new List<Student>();
        Student selectedStudent = null;

        public ObservableCollectionVSList()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(ObservableCollectionVSList_Loaded);
        }

        void ObservableCollectionVSList_Loaded(object sender, RoutedEventArgs e)
        {
            Student student1 = new Student() { StudentID = "001", StudentName = "张三" };
            Student student2 = new Student() { StudentID = "002", StudentName = "李四" };
            Student student3 = new Student() { StudentID = "003", StudentName = "王五" };
            students.Add(student1);
            students.Add(student2);
            students.Add(student3);
            //绑定
            listBox1.ItemsSource = students;
            listBox1.DisplayMemberPath = "StudentName";
            //注册选择项事件
            this.listBox1.SelectionChanged += new SelectionChangedEventHandler(listBox1_SelectionChanged);           

        }      

        void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
            selectedStudent = this.listBox1.SelectedItem as Student;            
        }

        //删除
        private void btnDel_Click(object sender, RoutedEventArgs e)
        {
            if (selectedStudent != null)
            {
                students.Remove(selectedStudent);
            }          

        }
        //修改
        private void btnEdit_Click(object sender, RoutedEventArgs e)
        {
            if (selectedStudent != null)
            {
                int myIndex = students.IndexOf(selectedStudent);
                students[myIndex].StudentName = "我改名了!";
            }
        }
        //添加
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            Student student = new Student() { StudentID="009",StudentName="Joetao"};           
            students.Add(student);
        }
    }
    public class Student
    {
        public string  StudentID { get; set; }
        public string  StudentName { get; set; }
    }   

    //分别采用 ObservableCollection<Student>与List<Student>作为绑定数据源
    //当我们用List<T>作为数据源绑定UI控件时:当做增删改操作来修改students绑定数据源时,数据源都不能通知UI更新。
    //当我们用ObservableCollection<T>作为数据绑定UI控件时:当做增删改操作来修改students绑定数据源时,Add()和Remove()操作修改的数据源能通知UI更新,而改操作不能更新UI.
    //                               //这一点正说明了MSDN上对ObservableCollection<T>类介绍:"表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。"
   
    //我在处理这个问题理解偏差:
    //在一开始的时候我对这句话:“实现您自己的集合之前,应考虑使用 ObservableCollection<T> 类,该类具有 INotifyCollectionChanged 和 INotifyPropertyChanged 的内置实现。“
    //被我理解为了只要用了ObservableCollection<T>,这个类集合以及类集合中的所有成员属性就具有更改通知的功能,这个理解是错误。ObservableCollection<T>只是针对T类型而言,并非给予了
    //类成员属性更改通知的功能,要想类成员属性具有更改UI功能还得让类继承INotifyPropertyChanged接口,并用 (NotifyCollectionChangedEventArgs) 的事件数据报告有关集合更改的特性的信息
    }


(二)实现类成员更改通知UI:

     要想实现类属性值修改,我们必须修改Student类,如下:

    public class Student : INotifyPropertyChanged
    {
        private string studentID;
        public string StudentID
        {
            get { return studentID; }
            set
            {
                studentID = value;
                NotifyPropertyChange("StudentID");
            }
        }
        private string studentName;
        public string StudentName
        {
            get { return studentName; }
            set
            {
                studentName = value;
                NotifyPropertyChange("StudentName");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

(三)总结:
          本篇学习了 ObservableCollection<T>与List<T>作为绑定数据源的不同,实例充分说明了 ObservableCollection<T>在Silverlight中作为绑定数据源的优势! 并例举了自己最初对ObservableCollection<T>的误解。并说明了怎样实现类属性成员的修改更改UI的实现方法!这里绑定可以是OneTime,OneWay,TwoWay.具体    理解可以看我的另一篇文章Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解

(四)
数据层已经变了,为何有时更新不了界面,因为取不到界面

(五)
线程内进行
for (int i = 0; i < vCancels.Count; i++)
                {
                    Mgr.TransactionService.CancelOrder("F", vCancels[i].OrderId, vCancels[i].ContractNo, vCancels[i].OperatorNo);
                }


不要涉及到任何界面的,开始用界面的iTransactionService
iTransactionService = Mgr.TransactionService;
线程中for循环还是会卡界面
分享到:
评论

相关推荐

    WPF柱状图源码

    1. **ObservableCollection&lt;T&gt;**:这是WPF中用于数据绑定的重要类。当你添加、删除或更改集合中的元素时,它会自动通知UI进行相应的更新。 2. **XAML布局**:在创建UI时,我们通常会使用XAML(eXtensible ...

    wpf Combobox绑定

    这通常是一个集合,如`ObservableCollection&lt;T&gt;`,其中`T`是你要显示的类型。这个集合可以是静态的,也可以动态生成。 2. **设置ItemsSource**:在`ComboBox`上设置`ItemsSource`属性,将其绑定到你的数据源。例如...

    WPF DataGrid 添加合计行并始终显示在底部代码

    数据源可以是任何实现了`IEnumerable`接口的对象,例如`ObservableCollection`或`List&lt;T&gt;`。以下是一个简单的例子: ```xml &lt;DataGrid x:Name="dataGrid" ItemsSource="{Binding YourDataSource}" ...

    wpf mvvm动态加载菜单,无限级

    在WPF中,我们可以使用`ObservableCollection&lt;T&gt;`来存储菜单项,因为这个集合是支持数据绑定的,可以实时反映数据的变化。视图模型中的菜单数据结构可能是这样的: ```csharp public class MenuItem { public ...

    WPF_MVVM_入门教程

    例如,你可以使用`ObservableCollection&lt;T&gt;`来存储数据,这是一个能够自动通知观察者(如WPF UI)其内容发生变化的集合类型。这是因为`ObservableCollection&lt;T&gt;`实现了`INotifyPropertyChanged`接口,当集合中的元素...

    WPF 数据.pdf

    ### WPF 数据绑定知识点 #### 1. 数据绑定概述 - **定义**: 数据绑定是一种将UI元素与其要显示的数据源连接起来的技术。当数据发生变化时,UI会自动更新以反映这些变化;反之亦然。 - **特点**: - WPF提供了一种...

    c#自定义listview(可加入进度条)

    为了使ListView显示数据,你需要提供一个数据源,通常是ObservableCollection或List&lt;T&gt;,并将其绑定到ListView: ```csharp ObservableCollection&lt;MyDataModel&gt; dataSource = new ObservableCollection&lt;MyDataModel...

    wpf 绑定数据 元素与原素之间 访问数据

    如果数据源是集合类型,如`ObservableCollection&lt;T&gt;`,可以使用`ItemsControl`和数据模板显示集合中的每一项。数据模板定义了集合中每个元素的UI表现形式: ```xml &lt;ItemsControl ItemsSource="{Binding ...

    wpf实现可编辑listview(新版)

    这通常通过设置ListView的ItemsSource属性完成,可以绑定到任何实现IEnumerable的对象,如ObservableCollection或List&lt;T&gt;。例如: ```xml &lt;ListView ItemsSource="{Binding DataItems}"&gt; ``` 这里的`DataItems`是...

    WPF WPFToolkit Chart 线性图表例子

    `LineSeries`通常与数据集(如`ObservableCollection`或`List&lt;T&gt;`)绑定,其中每个元素包含用于图表的X值和Y值。 3. **样式定制**:为了改变线的样式,你可以使用`GridLineStyle`属性。这允许你自定义线条的颜色、...

    WPF增删改查

    可以使用数据绑定将UI控件与数据源关联,如`ItemsSource`属性绑定到一个集合,如`ObservableCollection&lt;T&gt;`。查询数据通常在DAL中完成,如使用ADO.NET的`SqlCommand`执行SELECT语句,返回的数据集可以填充到`...

    wpf 多种Treeview demo

    - 使用`ItemsSource`属性将数据源绑定到`TreeView`,可以是任何实现了`IEnumerable`的对象,如`ObservableCollection&lt;T&gt;`或`ICollectionView`。 - `HierarchicalDataTemplate`定义了如何显示和展开子节点,它的`...

    WPF例子集合

    此外,ObservableCollection&lt;T&gt;经常被用作动态数据源,因为它能自动通知视图数据的变化。 3. **WPF多个数据源的示例** 当一个界面需要同时显示来自多个数据源的信息时,就会涉及复合数据绑定。开发者可能使用...

    WPF .net4.5 +MvvmLight +Sqlite 实现数据增加删除即时更新到datagrid,源码

    具体到实现数据增加和删除即时更新的功能,开发者可能使用了ObservableCollection&lt;T&gt;作为ViewModel中的数据源。ObservableCollection是一个实现了INotifyPropertyChanged和INotifyCollectionChanged接口的集合类,当...

    WPF ListView排序

    例如,你可以使用ObservableCollection&lt;T&gt;。 2. **创建ICollectionView对象**:通过`CollectionViewSource.GetDefaultView()`方法获取ListView数据源的ICollectionView实例。这个视图可以用来添加排序规则。 3. **...

    一个基于C#+WPF实现的MediaPlayer播放器程序例子代码

    除此之外,为了实现播放列表功能,开发者可能还需要使用到ObservableCollection&lt;T&gt;,这是一个动态数据集合,可以监控其内容的变化,并自动更新与之绑定的UI元素。在这个例子中,可能有一个列表视图展示所有媒体文件...

    wpf xaml 简单例子

    最常见的数据源类型是`ObservableCollection&lt;T&gt;`,它是一个可以观察的列表,当添加或删除元素时,UI会自动更新。 **双向数据Binding** 默认情况下,WPF的数据Binding是单向的,即从数据源到UI。但通过设置`Mode=...

    WPF的性能问题 -- 项目测试源码

    使用ObservableCollection&lt;T&gt;处理动态集合,以实现高效的通知机制。 3. **内存管理**:WPF应用程序容易造成内存泄漏,尤其是由于资源未正确释放或强引用导致的。确保在不再需要对象时调用Dispose方法,避免在控件上...

    WPF 可视化小例子

    这通常通过ObservableCollection&lt;T&gt;对象来实现,因为它支持动态更改通知,当数据库数据变化时,DataGrid会自动更新。 2. ODBC数据库连接:在C#中,我们可以使用System.Data.Odbc命名空间下的OdbcConnection类来建立...

    WPF中ListView分页

    通过Binding,我们可以将ListView的数据源设置为任何实现了INotifyPropertyChanged接口的对象集合,如ObservableCollection&lt;T&gt;。当数据源发生变化时,界面会自动更新。 **实现ListView分页** 实现ListView分页通常...

Global site tag (gtag.js) - Google Analytics