WPF DataGrid ListView等控件Binding LINQ數據源


Binding及與之配套的數據轉換和校驗是WPF的核心。一些詳細的只是介紹,園子里到處都是,這里DebugLZQ不再贅述。

首先回顧下WPF常用的Binding數據源

1.控件屬性---控件的屬性與屬性Binding           

經典的例子如下:

<TextBox Height="23" HorizontalAlignment="Left" Margin="28,42,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=Value,ElementName=slider1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
        <Slider Height="23" HorizontalAlignment="Left" Margin="28,94,0,0" Name="slider1" VerticalAlignment="Top" Width="225" />

重點是這里:

Text="{Binding Path=Value,ElementName=slider1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

2.Object數據源       

控件的屬性與一個內存Object綁定,該對象所在類實現IPropertyChanged接口

using System.ComponentModel;//

namespace Binding
{
    class Machine:INotifyPropertyChanged
    {
        #region INotifyPropertyChanged 成員

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        private int temperature;
        public int Temperature
        {
            get { return temperature; }
            set 
            {
                temperature = value;
                //引發事件
                if (PropertyChanged != null)
                {
                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs("temperature"));
                }
            }
        }
    }
}

頁面布局如下:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace Binding
{
    /// <summary>
    /// Window2.xaml 的交互邏輯
    /// </summary>
    public partial class Window2 : Window
    {
        Machine machine;
        public Window2()
        {
            InitializeComponent();

            //數據源
            machine = new Machine();
            //Binding
            System.Windows.Data.Binding binding = new System.Windows.Data.Binding();
            binding.Source = machine;
            binding.Path = new PropertyPath("Temperature");
            //
            BindingOperations.SetBinding(textBox1, TextBox.TextProperty, binding);

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 500;
            timer.Enabled = true;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            machine.Temperature++;
        }
    }
}

3.XML數據源     

不去多說,前面的博文中有類似的

4.ADO.NET中的DataTable  

即從數據庫獲得一個DataTable對象, Binding到DataGrid或ListView。

自定義數據庫表定義如下:

//----------直接DataTable數據源-------------------------------------
DataTable dataTable = SQLHelper.GetDataTable();
dataGrid1.ItemsSource = dataTable.DefaultView;

SQLHelper類如下,該靜態類之定義了一個方法用來獲得一個DataTable,下面的LINQ數據源使用相同的SQLHelper.GetDataTable()方法。

using System.Data.SqlClient;
using System.Data;

namespace Binding
{
    class SQLHelper
    {
        public static string connstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\VS2010Pros\Binding\Binding\Database1.mdf;Integrated Security=True;User Instance=True";
            
        public static DataTable GetDataTable()
        {
            using (SqlConnection conn = new SqlConnection(connstring))
            {
                string sql = @"select Id,Name,Age from tb_Student";
                SqlDataAdapter sda = new SqlDataAdapter(sql, conn);

                DataTable dt = new DataTable();                
                sda.Fill(dt);

                return dt;
            }

            
        }
    }
}

在xaml中加入Binding,DataGrid控件定義如下:

<DataGrid AutoGenerateColumns="False" Height="130" HorizontalAlignment="Left" Margin="24,16,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="230" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Width="60" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Name" Width="100" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Age" Width="60" Binding="{Binding Age}"/>
            </DataGrid.Columns>
        </DataGrid>

結果如下(因為DebugLZQ現在開啟的是XP系統,所以界面有點丑):

5.LINQ 數據源  DataGrid ListView等控件Binding LINQ數據源                

主要是LINQ to DataSet 和LINQ to SQL。

首先是LINQ to DataSet Binding到ListView。其中的dataTable獲取方法和上面的一樣。

            //----------Linq to DataSet數據源----------------------------------------
            var query = from row in dataTable.Rows.Cast<DataRow>()
                        where Convert.ToString(row["Name"]).StartsWith("D")
                        select new
                        {
                            Id=int.Parse(row["Id"].ToString()),
                            Name=row["Name"].ToString(),
                            Age = int.Parse(row["Age"].ToString())
                        };
            
            listView1.ItemsSource = query;

ListView 定義及Binding如下:

        <ListView Height="100" HorizontalAlignment="Left" Margin="24,173,0,0" Name="listView1" VerticalAlignment="Top" Width="224" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Id" Width="60" DisplayMemberBinding="{Binding Id}"/>
                    <GridViewColumn Header="Name" Width="100" DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Header="Age" Width="60" DisplayMemberBinding="{Binding Age}"/>
                </GridView>
            </ListView.View>
        </ListView>

結果如下:

下面給是LINQ to SQL 數據源Binding到DataGrid控件。

 用來映射tb_Student表的Student類定義如下:

using System.Data.Linq.Mapping;

namespace Binding
{
    [Table(Name="tb_Student")]
    class Student
    {
        [Column(IsPrimaryKey = true, DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true, Name = "Id")]
        public int Id { get; set; }

        [Column(DbType = "nvarchar(20)", Name = "Name")]
        public string Name { get; set; }

        [Column(DbType = "int", Name = "Age")]
        public int Age { get; set; }

    }
}

對數據源的LINQ操作如下,隨便寫了一個:

//---------Linq to SQL 數據源------------------------------------
System.Data.Linq.DataContext dc = new System.Data.Linq.DataContext(SQLHelper.connstring );

var students= dc.GetTable<Student>();

var query_2 = from s in students
        where s.Name.Contains("D")
        select s;

dataGrid2.ItemsSource = query_2;

DataGrid 定義及Binding如下:

<DataGrid AlternatingRowBackground="#FFAACC0B" AutoGenerateColumns="False" Height="130" HorizontalAlignment="Left" Margin="267,74,0,0" Name="dataGrid2" VerticalAlignment="Top" Width="230">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Id}" Header="Id" Width="60"   />
                <DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="100" />
                <DataGridTextColumn Binding="{Binding Age}" Header="Age" Width="60"  />
            </DataGrid.Columns>
        </DataGrid>

程序運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM