WPF中的binding(七)- 使用LINQ检索作为Binding的数据源

LINQ,百度百科上这样解释:
LINQ,语言集成查询(Language Integrated Query)是一组用于C#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

这里在列举一个百度百科举的一个小例子,查询int数组中小于5的数字,并按照大小顺序排列。

int[] arr = new int[] { 8, 5, 89, 41, 1, 2, 3, 65, 1 };
            var m = from n in arr where n < 5 orderby n descending select n;
            foreach(var va in m)
            {
                Console.WriteLine(va);
            }


综合以上解释和例子,所谓的LINQ,就是把内存表当成一个SQL数据库,从而可以利于类似SQL语句的语法对其进行查询,从而很方便地操作对List、数组等内存数据集合。
下面,分别利用List、DataTable、XML作为LINQ查询对象,并以查询结果作为Binding的数据源进行说明,利用LINQ检索结果作为数据源的方式。
首先,我们新建一个Student类:


public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

设计UI如下,放置一个ListView用来显示Student列表信息,分贝放置三个按钮设置不同展示Student列表信息的方式。

 <Window x:Class="_6_22.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView Name="listViewStudent" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Id" Width="60" 
                                    DisplayMemberBinding="{Binding Id}"/>
                    <GridViewColumn Header="Name" Width="60" 
                                    DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Header="Age" Width="60" 
                                    DisplayMemberBinding="{Binding Age}"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Content="加¨®载?List" Height="25" Margin="5" Click="Button1_Click"/>
        <Button Content="加¨®载?DataTable" Height="25" Margin="5,190,5,96" Click="Button2_Click"/>
        <Button Content="加¨®载?XML" Height="25" Margin="5,234,5,52" Click="Button3_Click"/>
    </Grid>
</Window>
一、以List作为LINQ查询对象:

/// <summary>
        /// 加¨®载?list
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            List<Student> stuList = new List<Student>()
            {
                new Student(){Id=0,Name="Tim",Age=29},
                new Student(){Id=1,Name="Tom",Age=28},
                new Student(){Id=2,Name="Kyle",Age=27},
                new Student(){Id=3,Name="Tony",Age=26},
                new Student(){Id=4,Name="Vina",Age=25},
                new Student(){Id=5,Name="Hyman",Age=24},
            };
            this.listViewStudent.ItemsSource = from stu in stuList where stu.Name.StartsWith("T") select stu;
        }

二、以DataTable作为LINQ查询对象:

/// <summary>
        /// 加¨®载?DataTable
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            DataColumn col1 = new DataColumn("Id");
            DataColumn col2 = new DataColumn("Name");
            DataColumn col3 = new DataColumn("Age");
            dt.Columns.Add(col1);
            dt.Columns.Add(col2);
            dt.Columns.Add(col3);
            DataRow row1 = dt.NewRow();
            row1["Id"] = 0;
            row1["Name"] = "Tim";
            row1["Age"] = 29;
            dt.Rows.Add(row1);

            DataRow row2 = dt.NewRow();
            row2["Id"] = 1;
            row2["Name"] = "Tom";
            row2["Age"] = 28;
            dt.Rows.Add(row2);

            DataRow row3 = dt.NewRow();
            row3["Id"] = 2;
            row3["Name"] = "Kyle";
            row3["Age"] = 27;
            dt.Rows.Add(row3);

            DataRow row4 = dt.NewRow();
            row4["Id"] = 0;
            row4["Name"] = "Tony";
            row4["Age"] = 26;
            dt.Rows.Add(row4);

            DataRow row5 = dt.NewRow();
            row5["Id"] = 0;
            row5["Name"] = "Vina";
            row5["Age"] = 25;
            dt.Rows.Add(row5);

            DataRow row6 = dt.NewRow();
            row6["Id"] = 0;
            row6["Name"] = "Hyman";
            row6["Age"] = 24;
            dt.Rows.Add(row6);

            this.listViewStudent.ItemsSource =
                from row in dt.Rows.Cast<DataRow>()
                where Convert.ToString(row["Name"]).StartsWith("T")
                select new Student()
                {
                    Id = int.Parse(row["Id"].ToString()),
                    Name = row["Name"].ToString(),
                    Age = int.Parse(row["Age"].ToString())
                };
        }

三、以XML作为LINQ查询对象:

/// <summary>
        /// 加¨®载?XML
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            XDocument xdoc = XDocument.Load(@"D:\Test.xml");
            this.listViewStudent.ItemsSource =
                from element in xdoc.Descendants("Student")
                where element.Attribute("Name").Value.StartsWith("T")
                select new Student()
                {
                    Id = int.Parse(element.Attribute("Id").Value),
                    Name = element.Attribute("Name").Value,
                    Age = int.Parse(element.Attribute("Age").Value)
                };
        }


最终的显示效果如下:





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值