DataBinding with Silverlight 3 and Silverlight 2

วิดีโอแนะนำ MIC

ผลิตภัณฑ์แนะนำ

RSS จาก MIC

  • ข่าวสาร
  • กิจกรรม
  • บทความ
  • วิดีโอ How do i?
  •  การทำ binding ข้อมูลใน Silverlight 3 (หรือ Silverlight 2) นั้นสิ่งแรกเราจะต้องรู้ เกี่ยวกับคำสั่งในการ binding ก่อนดังนี้

    {Binding}  เป็นคำสั่ง default สำหรับโหมด Oneway (ข้อมูลจะมีการไหลจากแหล่งข้อมูลหรือ Data Source ไปที่

    User Interface )

    {Binding  path} เป็นคำสั่งที่มีการกำหนด path สำหรับแหล่งข้อมูลที่ใช้

    {Binding properties} เป็นคำสั่งที่ต้องมีการเรียกใช้ properties 

    {Binding path,properties} เป็นคำสั่งที่ต้องกำหนด path และ properties

    ในบทความนี้จะแสดงออกมาสองตัวอย่างคือ การทำ DataBinding จาก Class และ การทำ DataBinding ผ่าน WCF  

    ตัวอย่างการ ทำ DataBinding  Class

          หลังจากที่สร้างโปรเจค Silverlight แล้วให้ทำการสร้าง class ขึ้นมาใน project silverlight  โดยการคลิกขวาที่

    โปรเจคเลือก Add->New Item จากนั้นให้ทำการเลือก class  แล้วตั้งชื่อคลาสด้วย ดังรูปที่ 1

     รูป 1 แสดงหน้าต่าง Add New Item

    จากนั้นคลิกที่ปุ่ม Add แล้วเขียนโค้ดดังนี้

    using System;

    using System.Net;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Documents;

    using System.Windows.Ink;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Animation;

    using System.Windows.Shapes;

    namespace SilverlightApplication1

    {

        public class EmployeeClass

        {

            public int EmployeeID { get; set; }

            public string EmployeeName { get; set; }

            public int EmployeeAge { get; set; }

            public EmployeeClass(int EmployeeID, string EmployeeName, int EmployeeAge)

            {

                this.EmployeeID = EmployeeID;

                this.EmployeeName = EmployeeName;

                this.EmployeeAge = EmployeeAge;

            }

        }

    }

     

    ขั้นตอนต่อไปหลังจากสร้างคลาส EmployeeClass แล้วคือกำหนด ListBox และ TextBlock เพื่อที่จะนำข้อมูลมาใส่ โดยให้ไปที่ไฟล์ Page.xaml เขียนโค้ดดังนี้

    <UserControl x:Class="SilverlightApplication1.Page"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        mc:Ignorable="d"

        d:DesignHeight="300" d:DesignWidth="400">

        <Canvas HorizontalAlignment="Center">

            <ListBox  x:Name="empListBox" Width="400" Height="300">

                <ListBox.ItemTemplate>

                    <DataTemplate>

                        <Grid>

                            <Grid.RowDefinitions>

                                <RowDefinition/>

                                <RowDefinition/>

                            </Grid.RowDefinitions>

                            <Grid.ColumnDefinitions>

                                <ColumnDefinition/>

                                <ColumnDefinition/>

                                <ColumnDefinition/>

                            </Grid.ColumnDefinitions>

                           <TextBlock Text="ID   " Grid.Row="0" Grid.Column="0"></TextBlock>

                           <TextBlock Text="{Binding EmployeeID}" Grid.Row="1" Grid.Column="0"></TextBlock>

                           <TextBlock Text="Name   " Grid.Row="0" Grid.Column="1"></TextBlock>

                           <TextBlock Text="{Binding EmployeeName}" Grid.Row="1" Grid.Column="1"></TextBlock>

                           <TextBlock Text="Age   " Grid.Row="0" Grid.Column="2"></TextBlock>

                           <TextBlock Text="{Binding EmployeeAge}" Grid.Row="1" Grid.Column="2"></TextBlock>

                      </Grid>

                    </DataTemplate>

                </ListBox.ItemTemplate>

            </ListBox>

      </Canvas>

    </UserControl>

     

    คำอธิบาย Page.xaml

           ใน TextBlock สังเกตว่ามีการเรียกใช้คำสั่ง {Binding properties} ซึ่งเป็นการนำข้อมูลมาใส่ให้กับ TextBlock โดย หลังชื่อ Binding จะเป็น properties ของคลาส EmployeeClass ซึ่งถ้ามี properties อื่นก็สามารถใส่ได้แต่เราต้องกำหนด properties ใน EmployeeClass ด้วย

    จากนั้นก็ไปที่ Page.xaml.cs แล้วเขียนโค้ดดังนี้

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Net;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Documents;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Animation;

    using System.Windows.Shapes;

    namespace SilverlightApplication1

    {

        public partial class Page : UserControl

        {

            private List<EmployeeClass> empList;

            public Page()

            {

                InitializeComponent();

                empList = new List<EmployeeClass>();

                empList.Add(new EmployeeClass(100, "John", 23));

                empList.Add(new EmployeeClass(101, "Jame", 34));

                empList.Add(new EmployeeClass(102, "Paula", 27));

                empListBox.ItemsSource = empList;

            }

        }

    }

     

    คำอธิบาย Page.xaml.cs

      ในหน้านี้จะมีการสร้างอาเรย์เพื่อกำหนดข้อมูลให้กับตัวแปร empList โดยตัวแปรนี้จะเก็บข้อมูลที่เป็นอาเรย์ไว้หลังจากกำหนดข้อมูลแล้วก็นำข้อมูลที่ได้มากำหนดให้

    กับ ListBox ที่ชื่อ empListBox โดยใช้คำสั่ง ItemSource อีกที

     

    ผลลัพธ์ แสดงดังรูป 2


      รูป 2 แสดงผลลัพธ์ใน ListBox

     

    การ Binding  โดยใช้ LINQ ผ่าน WCF Service

      ใน binding ข้อมูลใน Silverlight โดยใช้ LINQ เราจะต้องสร้าง WCF Service  ขึ้นมาก่อนเพราะในโปรเจค Silverlight นั้นเราไม่สามารถที่จะสร้าง LINQ class ได้โดยตรงแต่จะต้องสร้างผ่านโปรเจค Web Application อีกทีนึงแล้วทำการเรียกผ่าน WCF Service ซึ่งการสร้าง LINQ รวมถึง WCF นั้นอย่างแรกเราต้องเตรียมฐานข้อมูลก่อนโดยในตัวอย่างจะใช้ ฐานข้อมูลที่ชื่อ Northwind ซึ่งวิธีการติดตั้ง ฐานข้อมูล Northwind ใน Microsoft SQL Server 2008 มีดังนี้(ถ้าใคร ใช้Microsoft SQL Server 2005 เวอร์ชั้นเต็มหรือ Express  ก็ใช้วิธีเดียวกัน) โดยให้ไป Download Northwind จาก

    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=06616212-0356-46a0-8da2-eebc53a68034

    หลังจาก Download แล้วก็ให้ทำการติดตั้งพอติดตั้งเสร็จแล้ว ไฟล์ที่ติดตั้งจะอยู่ที่ c:\SQL Server 2000 Sample Database (ในกรณีที่ไม่มีการเปลี่ยน path ในการติดตั้ง) หลังจากนั้นก็เปิด Command prompt ขึ้นมาแล้วให้เปลี่ยน path ใน Command Prompt ไปที่ C:\SQL Server 2000 Sample Database(ถ้าติดตั้งที่ path อื่นนอกเหนือจากตัวอย่างก็ให้ย้าย path ให้ถูกต้อง) หลังจากนั้นก็ให้พิมพ์คำสั่ง sqlcmd –S  .   –i instnwnd.sql  ในกรณีที่ใช้เวอร์ชั่นเต็ม(ไม่ใช่เวอร์ชั่น Express) แต่ถ้าเป็นเวอร์ชั่น Express ก็ให้พิมพ์ sqlcmd –S .\sqlexpress  -i instnwnd.sql   

    ***ตรง –S  ให้พิมพ์ S ตัวใหญ่***

    หลังจากพิมพ์คำสั่งแล้วก็กด Enter ฐานข้อมูลก็ได้ถูกติดตั้งลงไปใน Microsoft SQL Server แล้วจากนั้นก็ให้ทดสอบ โดยการใช้คำสั่ง  sqlcmd –S .  หรือ sqlcmd –S .\sqlExpress แล้วกด Enter ผลลัพธ์จะได้ดังรูป 3

     รูป 3 แสดงหน้าต่างของ SQLCMD

    จากนั้นก็ให้พิมพ์ คำสั่งดังนี้

    USE Northwind   (กด Enter)

    SELECT * FROM Customers (กด Enter)

    GO (กด Enter)

    ผลลัพธ์จะได้ข้อมูลที่อยู่ใน Table ที่ชื่อ Customers แสดงใน หน้าต่างๆ SQLCMD

    หลังที่ได้ทดสอบกับการติดตั้งฐานข้อมูลเสร็จแล้วต่อไปก็เริ่มทำในส่วน Databinding โดย

    ในตัวอย่างนี้จะใช้โค้ดของเดิมแต่ให้ทำการเพิ่ม LINQ และ WCF เข้ามาโดยคลิกขวาเลือก โปรเจค Web Application (โปรเจคที่ถูกสร้างมาพร้อมกับ Silverlight) แล้วเลือก Add ->

    New Item  จะมีหน้าต่าง Add New Item แสดงขึ้นมาให้เลือกที่  LINQ to SQL Class ดังรูปที่ 4

     

     รูป 4 แสดงหน้าต่าง Add New Item เพื่อเลือก LINQ to SQL Classes

    จากนั้นคลิกที่ปุ่ม Add ตรง Solution Explorer จะมีไฟล์ DataClasses1.dbml ถูกสร้างขึ้นมาดังรูปที่ 5


    รูป 5 แสดงไฟล์ DataClasses1.dbml

    นอกจากไฟล์ DataClasses1.dbml ถูกสร้างใน Solution Explorer แล้วก็จะมี หน้า designer ของ DataClasses1.dbml ถูกสร้างขึ้นมาเพื่อที่สามารถลาก Table ต่างๆมาวางในนี้ได้ดังรูป 6

    รูป 6 แสดงหน้าของ DataClasses1.dbml

    หลังจากนั้นให้คลิกที่ไฟล์ DataClasses1.dbml แล้วดูใน panel Properties ตรง Serialization Mode เลือกเป็น Unidirectional   ในการ เพิ่ม Table ลงไปในหน้า DataClasses1.dbml นี้ก็ให้ทำการเปิด panel ที่ชื่อServer Explorer  มาก่อน โดยเลือก menu bar ที่ชื่อ View -> Server Explorer ซึ่งจะได้ panel ดังรูป 7


    รูป 7 แสดงหน้า panel ของ Server Explorer

    ใน Server Explorer นี้ให้คลิกที่ Connect to Database… ดังรูป 8


    รูป 8 แสดง icon  Connect to Database

    จากนั้นจะมีหน้าต่าง Choose Data Source ขึ้นมาให้เลือก Data Souce ที่ต้องการจะติดต่อในตัวอย่างนี้จะเลือก Microsoft SQL Server แล้วคลิกที่ปุ่ม Continue  เพื่อเข้าสู่หน้า  Add Connection  ในหน้านี้ให้กำหนด Server name , ชนิดของการ Log on ในช่อง Log on  to the server และเลือกฐานข้อมูลที่ต้องการติดต่อในช่อง Select or enter a database name(จะต้องมีการติดตั้งฐานข้อมูลใน Microsoft SQL Server ไว้ก่อนในตัวอย่างจะใช้ฐานข้อมูลที่ชื่อ Northwind) ดังรูป 9


    รูป 9 แสดงตัวอย่างการใส่ค่าในหน้าต่าง Add Connection

    หลังจากใส่รายละเอียดแล้วก็ให้คลิกที่ปุ่ม Test Connection ดูเพื่อทดสอบว่าสามารถติดต่อกับฐานข้อมูลได้หรือไม่ซึ่งถ้าติดต่อไม่ได้ก็ให้ไปตรวจสอบ Data Source ว่าเรากำหนดถูกหรือป่าวและในส่วนของช่องการ Log on to the server ก็ให้ตรวจสอบว่าเราได้ทำการใช้แบบ Window Authentication หรือ SQL Server Authentication และสุดท้ายก็ตรวจสอบชื่อฐานข้อมูลว่ามีใน Microsoft SQL Server หรือเปล่า(ในกรณีที่ใช้ Data Source เป็น Microsoft SQL Server) ถ้าถูกต้องหมดหลังจากคลิกปุ่ม Test Connection จะต้องขึ้น      ดังรูปที่ 10


    รูป 10 แสดงหน้าต่างว่าสามารถติดต่อกับฐานข้อมูลได้

    จากนั้นคลิกที่ปุ่ม OK เพื่อออกจากหน้าต่าง Add Connection ใน Server Explorer ก็จะมีฐานข้อมูลที่ชื่อ Northwind ขึ้นมา ให้ ไปเลือก Table ที่ต้องการในตัวอย่างจะเลือก Table ที่
    ชื่อ Employees ดังรูป 11


    รูป 11 แสดง Table Employees

    หลังจากที่ได้ทำการเลือกแล้วก็ให้ลากมาวางในหน้า DataClasses1.dbml  ดังรูป 12


    รูป 12 แสดงคลาส Employee

    ซึ่งตอนนี้เราก็ได้ Table ที่ต้องการจะทำการ binding แล้วต่อไปก็คือสร้าง Service เพื่อเป็นตัวกลางติดต่อระหว่าง Silverlight กับ LINQ (คลาส Employee) เพื่อที่จะให้ทางฝั่ง Silverlight สามารถที่จะ binding ข้อมูลจาก ฟิลด์ต่างๆในคลาส Employee ได้โดยคลิกขวาที่โปรเจค Web Application แล้วเลือก Add -> New Item แล้วให้เลือก Silverlight-enabled WCF Service         ดังรูป 13

    รูป 13 แสดงหน้าต่างการ Add New Item เพื่อเลือก WCF Service

    จากนั้นคลิกที่ปุ่ม Add โปรแกรมก็จะทำการสร้างไฟล์ Service1.svc.cs ดังรูป 14


    รูป
    14 แสดงไฟล์ Service1.svc.cs

    ในไฟล์ นี้ให้เขียนโค้ดดังนี้

    using System;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.ServiceModel;

    using System.ServiceModel.Activation;

    using System.Collections.Generic;

     

    namespace SilverlightApplication1.Web

    {

        [ServiceContract(Namespace = "")]

        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

        public class Service1

        {

            [OperationContract]

            public List<Employee> GetEmployees()

            {

                DataClasses1DataContext dContext = new DataClasses1DataContext();

                var empVar = from p in dContext.Employees select p;

                return empVar.ToList();

            }

        }

    }

     

    คำอธิบาย ไฟล์ Service1.svc.cs

         ในไฟล์นี้จะมีการใช้คำสั่งของ LINQ เพื่อที่จะส่งค่า ฟิลด์ต่างๆออกไปในตำแหน่งที่เรียกใช้โดยส่งออกเป็น List

    แล้วไปที่ไฟล์ Service1.svc.cs ให้รันที่ไฟล์นี้ (ถ้ารันไม่ได้ก็ให้คลิกขวาที่ไฟล์นี้แล้วเลือก  View in Browser ก่อน) พอรันแล้วจะได้ไฟล์ Service1 ดังรูป 15

     รูป 15 แสดง Service1

    ให้เรา copy url ที่อยู่ในรูป 15 (http://127.0.0.1:2469/Service1.svc ) ไว้แล้วไปที่โปรเจค Silverlight  ให้คลิกขวาที่ โปรเจคนี้แล้วเลือก Add Service Reference   แล้วจะมีหน้าต่าง Add Service Reference ขึ้นมา ให้เอา url ที่ได้ copy ไว้มาวางในช่อง Address  แล้วคลิกที่ปุ่ม Go ผลลัพธ์มีการ add Service ไปที่โปรเจค Silverlight ดังรูป 16


    รูป 16 แสดงหน้าต่าง  Add Service Reference

    จากนั้นคลิกที่ปุ่ม OK  แล้วให้ไปที่ไฟล์ Page.xaml ทำการแก้ไขข้อมูลสำหรับ binding ใหม่โดยใช้ใส่ชื่อฟิลด์ลงไปเช่น

        <TextBlock Text="ID   " Grid.Row="0" Grid.Column="0"></TextBlock>

        <TextBlock Text="{Binding EmployeeID}" Grid.Row="1" Grid.Column="0"></TextBlock>

        <TextBlock Text="LastName          " Grid.Row="0" Grid.Column="1"></TextBlock>

        <TextBlock Text="{Binding LastName}" Grid.Row="1" Grid.Column="1"></TextBlock>

        <TextBlock Text="Title   " Grid.Row="0" Grid.Column="2"></TextBlock>

         <TextBlock Text="{Binding Title}" Grid.Row="1" Grid.Column="2"></TextBlock>

    จากนั้นที่ไฟล์ Page.xaml.cs เขียนโค้ดดังนี้

     

     

     

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Net;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Documents;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Animation;

    using System.Windows.Shapes;

     

    namespace SilverlightApplication1

    {

        public partial class Page : UserControl

        {

            public Page()

            {

               InitializeComponent();

               ServiceReference1.Service1Client wcf = new SilverlightApplication1.ServiceReference1.Service1Client();

               wcf.GetEmployeesCompleted += new EventHandler<SilverlightApplication1.ServiceReference1.GetEmployeesCompletedEventArgs>(wcf_GetEmployeesCompleted);

               wcf.GetEmployeesAsync();

            }

     

            void wcf_GetEmployeesCompleted(object sender, SilverlightApplication1.ServiceReference1.GetEmployeesCompletedEventArgs e)

            {

                empListBox.ItemsSource = e.Result;

            }

        }

    }

     

    คำอธิบาย Page.xaml.cs

       ในไฟล์นี้จะเป็นการเรียก Service ที่เราได้ทำการสร้างขึ้นซึ่งหลังจากที่มีการเรียก event wcf_GetEmployeeCompleted  แล้วก็จะทำการ กำหนด ItemsSource ให้กับ Listbox ที่ชื่อ empListBox ผ่านคำสั่ง e.Result;

    ให้ทดสอบรันดูโดยกด F5  ผลลัพธ์จะได้ดังรูป 17


    รูป 17 แสดงผลลัพธ์ใน ListBox

    ***ในกรณีที่รันแล้วเกิด Error ดังรูปที่ 18 ก็ให้ไปศึกษาวิธีแก้ได้จาก web

    http://msdn.microsoft.com/en-us/library/dd470115(VS.95).asp


    รูป 
    18 แสดง Error

     สรุป

           บทความนี้ได้กล่าวถึงการ binding แล้วแสดงข้อมูลใน Silverlight ซึ่งในบทความนี้ได้แสดงตัวอย่างออกเป็น 2 รูปแบบคือ binding ข้อมูลโดยมีการสร้างคลาสขึ้นมาแล้วกำหนดข้อมูลผ่าน constructor และ binding โดยมีการดึงข้อมูลจากฐานข้อมูล และใช้ WCF เป็นตัวกลางในการติดต่อระหว่าง Silverlight Application และ Web Application จากตัวอย่างทั้งสองนี้สามารถใช้เป็นแนวทางในการศึกษาเรื่องของ DataBinding และนำไปประยุกต์ใช้กับ Application จริงที่ต้องมีการทำ DataBinding ได้

    เนื้อหาที่เกี่ยวข้อง

    Microsoft Expression Blend3 + SketchFlow



     

             

     

     

     

     

     


    Posted 10-12-2009 23:04 by Kreevut Assavakuptanon
          

    ติดต่อ : micth@microsoft.com
    เนื้อหาภายในเว็บไซต์นี้ เป็นลิขสิทธิ์ของบริษัทไมโครซอฟท์ (ประเทศไทย) จำกัด สงวนลิขสิทธิ์ พ.ศ. 2551