basquang™ on clouds

July 23, 2009

WPF: Binding to List Data

Filed under: WPF — basquang @ 5:16 AM

Trong các ví dụ trước chúng ta đã đề cập tới việc Binding data trong WPF sử dụng một object đơn lẻ. Tuy nhiên khi chúng ta có một tập các Object cần binding, lúc đó đặt ra các yêu cầu về quản lý Object hiện thời, sắp xếp, lọc hay nhóm các object. Chúng ta thường gặp kiểu biding với list data này với các dữ liệu XML, Relation Database…

Ví dụ dưới đây hướng dẫn cách binding to List data, get Current Item và Navigate giữa các Item trong List.

Trước hết chúng ta khai báo một People class, là collection của Person class

public class People: List<Person>
    {
       public People(){ }
    }

Trong Person class chúng ta thêm một phương thức khởi tạo, rỗng tham số. Điều này để thực hiện việc binding trong XAML

...
public Person() { }
...

Khi đó chúng ta sẵn sàng khai báo Collection trong XAML như sau:

<Window x:Class="ListDataBinding.Window1"
    ...
    xmlns:local="clr-namespace:ListDataBinding">
    <Window.Resources>
        <local:People x:Key="Hyperlogy">            
            <local:Person x:Name="Nhat" FirstName="Nhat" LastName="Mai" FullName="Nhat Mai" />
            <local:Person x:Name="Quang" FirstName="Quang" LastName="Nguyen" FullName="Quang Nguyen" />
            <local:Person x:Name="Duc" FirstName="Duc" LastName="Le" FullName="Duc Le" />
        </local:People>
    </Window.Resources>
    <Grid Name="grid" DataContext="{StaticResource Hyperlogy}">
        ...
        <TextBox Height="23" Margin="95,9,12,0" Name="txtFirstName" VerticalAlignment="Top" Text="{Binding Path=FirstName}" />
        <TextBox Margin="95,65,12,86" Name="txtLastName" Text="{Binding Path=LastName}" />
        <TextBlock Height="21" Margin="95,0,12,59" Name="tblFullName" VerticalAlignment="Bottom" Text="{Binding Path=FullName}" />
        ...
    </Grid>
</Window>

Để get Current Item chúng ta sử dụng ICollectionView và CurrentItem

...
ICollectionView view = GetCompanyView();
Person person = (Person)view.CurrentItem;
...
Để chuyển tới Item tiếp theo chúng ta sử dụng MoveCurrentToNext()
Để chuyển tới Item trước đó, chúng ta sử dụng MoveCurrentToPrevious()
 
Full Code:
public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        ICollectionView GetCompanyView()
        {
            People people = (People)this.FindResource("Hyperlogy");
            return CollectionViewSource.GetDefaultView(people);
        }
        private void btnDisplay_Click(object sender, RoutedEventArgs e)
        {
            // Get the current person out of the collection view            
            ICollectionView view = GetCompanyView();
            Person person = (Person)view.CurrentItem;
            person.FullName = person.FirstName + txtMiddleName.Text + person.LastName;
            MessageBox.Show(person.FullName);
        }
 
        private void btnNext_Click(object sender, RoutedEventArgs e)
        {
            ICollectionView view = GetCompanyView();
            view.MoveCurrentToNext();
            if (view.IsCurrentAfterLast)
            {
                view.MoveCurrentToLast();
            }
        }
 
        private void btnBack_Click(object sender, RoutedEventArgs e)
        {
            ICollectionView view = GetCompanyView();
            view.MoveCurrentToPrevious();
            if (view.IsCurrentBeforeFirst)
            {
                view.MoveCurrentToFirst();
            }
        }
    }

Kết quả

image

Advertisements

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

%d bloggers like this: