欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ListView 控件和 INotifyPropertyChanged 接口

程序员文章站 2022-03-30 22:15:58
ListView 控件和 DataGridView 控件 ListView 是跟 Winform 中 DataGridView 用法以及显示效果差不多的一个 WPF 控件,可以通过列表的方式方便的显示数据; 在 ListView 控件中 DataSource 属性在这里是 ;单条数据加载的方法是 , ......

listview 控件和 datagridview 控件

listview 是跟 winform 中 datagridview 用法以及显示效果差不多的一个 wpf 控件,可以通过列表的方式方便的显示数据;

ListView 控件和 INotifyPropertyChanged 接口

<!-- listview 控件 xaml 代码 -->
<listview name="listview" margin="10,10,9.6,10">
    <listview.view>
        <gridview>
            <gridviewcolumn header="任务"/>
            <gridviewcolumn header="任务描述"/>
            <gridviewcolumn header="循环周期(秒)"/>
            <gridviewcolumn header="任务状态/>
        </gridview>
    </listview.view>
</listview>

datagridview 控件的使用中,通常我们都会创建一个类用来储存数据,读取数据之后再创建一个这个类的集合,然后将集合赋给 datagridview1.datasource 属性;也可不用集合,直接在循环中把数据一条一条的加载 dategridview1.rows.add()

// 先创建一个用来储存数据的类
class userinfo
{
    public string name { get; set; }
    public int age { get; set; }
}
// winform:datagridview 控件
// 方法一:创建一个对象集合,赋值给 datasource 属性
list<userinfo> infos = new list<userinfo>();
for(int i = 0; i > 10; i++)
{
    infos.add(new userinfo
    {
        name = $"light_{i}",
        age = i
    });
}
datagridview1.datasource = infos;

// 方法二:一条一条的添加数据
for(int i = 0; i > 10; i++)
{
    dategridview1.rows.add(new userinfo
    {
        name = $"light_{i}",
        age = i
    });
}

在 listview 控件中 datasource 属性在这里是 listview.itemssource;单条数据加载的方法是 listview.items.add();,整体用法还是大同小异;

// wpf:listview 控件
// 方法一:创建一个对象集合,赋值给 itemssource 属性
list<userinfo> infos = new list<userinfo>();
for(int i = 0; i > 10; i++)
{
    infos.add(new userinfo
    {
        name = $"light_{i}",
        age = i
    });
}
listview.itemssource = infos;

// 方法二:一条一条的添加数据
for(int i = 0; i > 10; i++)
{
    listview.items.add(new userinfo
    {
        name = $"light_{i}",
        age = i
    });
}

inotifypropertychanged 接口

命名空间:system.componentmodel

inotifypropertychanged 是一个非常强大的接口,用于向对象绑定的客户端控件发出对象属性已更改的通知;

用人话说就是:正常我们向上面一样,把对象绑定到控件用来显示数据,有一个缺点:每次更改对象的属性之后,我们需要手动的重新再去绑定数据,否则数据是不会刷新显示修改后的值的;

但是如果对象实现了 inotifypropertychanged 接口的话,我们根本不用担心这些问题,直接修改已绑定对象的属性,客户端就会自动刷新显示数据;

比如说,上面我们创建的 userinfo 类就可以修改成这样:

class userinfo : system.componentmodel.inotifypropertychanged
{
    private string name;
    private int age;
    
    // 属性发生更改时触发的事件,由每个属性的 set 访问器调用
    public event propertychangedeventhandler propertychanged;
    
    public string name
    {
        get => name;
        set
        {
            name = value;
            propertychanged?.invoke(this, new propertychangedeventargs("name"));
        }
    }
    public string age
    {
        get => age;
        set
        {
            age = value;
            propertychanged?.invoke(this, new propertychangedeventargs("age"));
        }
    }
}

这样创建完成后,我们再安装上面的方法将对象绑定客户端控件,之后每次修改数据,就可以直接获取绑定的对象然后修改对象属性就可以了,无需再做任何操作;

// datagridview 控件
// 获取选中行,返回当前绑定对象
userinfo info = (userinfo)datagridview1.selectedrows[0].databounditem;
info.name = "liang";
info.age = 18;
// listview 控件
// 获取选中行,返回当前绑定对象
userinfo info = (userinfo)listview.selecteditem;
info.name = "liang";
info.age = 18;