zoukankan      html  css  js  c++  java
  • WPF DataGrid双向绑定

    总结

    先放结论:
    datagrid的刷新方式:

    1. 重新绑定 ,全部刷新,最常用的,都知道
    	datagrid.itemsSource=null;
    	datagrid.itemsSource=list;
    

    但有些时候不方便重新绑定,于是

    1. 针对数据源有增删,需要实时显示
    	将datagrid绑定的list<object>换成ObservableCollection<T>类型
    
    1. 只刷新特定列,需要继承INotifyPropertyChanged接口,具体如下例子

    问题描述

    问题源于公司项目中对一系列报警条目做 启用/屏蔽 开关,就是下面的小功能。
    在这里插入图片描述
    功能很顺利完成了,但是点击header上的总开关时,需要对整个datagrid刷新,才能让下面的开关状态正常显示出来。但是这个datagrid里面数据量比较大,而且部分列是动态生成的,对整个datagrid刷新会出现部分动态生成列没有正常加载。体验很不好。如果能只刷新这一列,其他的列不管,就好了。

    解决方案

    实现INotifyPropertyChanged的ViewModel。
    在datagrid绑定的数据实体类里,继承INotifyPropertyChanged,实现该方法,并在要实时刷新的列的set中加上

    	OnPropertyChanged("ColumnName");
    
    • 1

    写个列子:

    	public class student : INotifyPropertyChanged{
    	
    		public event PropertyChangedEventHandler PropertyChanged;
        	private void OnPropertyChanged(string propertyName)
        	{
            	if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        	}
        	
        	private bool _ischecked;
        	public bool ischecked{
    			get { return _ischecked; }
    			set { _ischecked=value; OnPropertyChanged("ischecked"); }
    		}
    		public string name { get; set; }
    	}
    
    

    如上设置之后,绑定ischecked的一列,只要数据源发生变化,data的这一列立马就会刷新,其他列,如上面的name列,即使数据变化了,不重新绑定数据,该列不会刷新。如下图的demo
    在这里插入图片描述
    Button点击事件中同时改变了ischecked和name数据。但界面上只有checkbox列刷新了。

  • 相关阅读:
    Android 70道面试题汇总不再愁面试
    TOMCAT用Https替换Http的方法
    Struts2+Spring3+Hibernate3配置全过程
    javac 无效标签
    hibernate
    数据库命令行启动
    Tomcat检测程序
    SQL
    Unsupported major.minor version 49.0的错误解决
    ImportError: No module named pysqlite2
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/15215305.html
Copyright © 2011-2022 走看看