listview 控件和 datagridview 控件

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

<!-- 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;