Thứ Năm, 23 tháng 7, 2009

WPF: Binding to List Data

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ả



A21319952F68E79E_413_0[1]

Không có nhận xét nào:

Đăng nhận xét