复杂列表绑定(集合绑定扩展)

复杂列表如ListView、DataGrid的绑定,类似集合绑定,集合中的类型换成了定义的类,如果集合需要发生变化的,依旧需要使用ObservableCollection<T> 或者其他继承自INotifyCollectionChanged接口的集合,在此以ObservableCollection<T>做示例。

准备工作

创建一个用于绑定类,导入基类

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public string UserName { get; set; }

    public string Desc { get; set; }

}

ListView绑定

添加一个ListView,然后增加对应的列

<ListView Margin="42,46,44,75" d:ItemsSource="{d:SampleData ItemCount=5}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" />
            <GridViewColumn Header="姓名" />
            <GridViewColumn Header="Email" />
            <GridViewColumn Header="用户名" />
            <GridViewColumn Width="100" Header="描述" />
        </GridView>
    </ListView.View>
</ListView>

注意: d:ItemsSource="{d:SampleData ItemCount=5}"是在设计器显示效果,实际运行时不产生数据。

添加绑定,将属性一一绑定到对应列上
在这里插入图片描述

<!--ListView中的列-->
<ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Id}" Header="ID" />
                    <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="姓名" />
                    <GridViewColumn DisplayMemberBinding="{Binding Email}" Header="Email" />
                    <GridViewColumn DisplayMemberBinding="{Binding UserName}" Header="用户名" />
                    <GridViewColumn DisplayMemberBinding="{Binding Desc}" Header="描述" />
                </GridView>
            </ListView.View>
        </ListView>

数据绑定

方式一:

使用控件名称直接绑定其ItemsSource,定义一个集合,初始化后直接绑定
在这里插入图片描述

运行结果:

在这里插入图片描述

方式二:

通过ViewModel绑定

创建MainWindowViewModel,添加相关属性

 public class MainWindowViewModel : ViewModelBase
    {
        private ObservableCollection<User> _users;

        public ObservableCollection<User> Users
        {
            get
            {
                return _users;
            }
            set
            {
                _users = value;
                OnPropertyChanged();
            }
        }

        public MainWindowViewModel()
        {
            UserDataInit();
        }
        
        
        /// <summary>
        ///模拟数据(忽略)
        /// </summary>
        void UserDataInit()
        {
            Users = new ObservableCollection<User>();
            for (int i = 0; i < 10; i++)
            {
                Users.Add(new User()
                {
                    Id = i,
                    Name = "张三",
                    Email = "11111@123.com",
                    UserName = "admin" + i,
                    Desc = "这是一个用户"
                });

            }
        }

在MainWindow后台代码上加上和ViewModel的绑定

 this.DataContext=new MainWindowViewModel();

在这里插入图片描述

在XAML中给ListView添加数据源绑定ItemsSource="{Binding Users}"
在这里插入图片描述
效果也一样:
在这里插入图片描述

DataGrid绑定

和ListView绑定方式基本一样,只是列的形式不一样

XAML

<DataGrid
    Grid.Column="1"
    Margin="19,49,12,75"
    ItemsSource="{Binding Users}"
    RenderTransformOrigin="0.5,0.5">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Id}" Header="ID" />
        <DataGridTextColumn Binding="{Binding Name}" Header="姓名" />
        <DataGridTextColumn Binding="{Binding Email}" Header="Email" />
        <DataGridTextColumn Binding="{Binding UserName}" Header="用户名" />
        <DataGridTextColumn Binding="{Binding Desc}" Header="描述" />
    </DataGrid.Columns>
</DataGrid>

后台的代码和ListView一样

实现效果:

在这里插入图片描述

会发现出现两次一样的列,只要把AutoGenerateColumns属性设置为False就行了
在这里插入图片描述

效果:
在这里插入图片描述

集合绑定绑定扩展

ListBox、ComboBox等绑定多属性的类集合,让其显示其中一个属性

示例(ListBox为例):

<ListBox
            Grid.Column="2"
            Width="317"
            Height="506"
            Margin="39,64,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            d:ItemsSource="{d:SampleData ItemCount=5}"
            ItemsSource="{Binding Users}" />

ListBox直接绑定Users,界面上只显示类名
在这里插入图片描述

此时只需要设置DisplayMenmBerPath属性为需要显示的属性,ListBox中的项就会显示对应的属性值,而且其SelectedItem属性依旧是选中的类对象
在这里插入图片描述

效果:

在这里插入图片描述

例子源代码下载:

Github

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐