basquang™ on clouds

July 24, 2009

WPF: Data Source Providers (Object)

Filed under: WPF — basquang @ 8:49 AM

Trong các phần trước chúng ta đã tiến hành binding sử dụng hardcoded object. Tuy nhiên, trong thực tế, hầu như chúng ta không sử dụng kiểu binding này. Các object có thể được lấy về từ nhiều nguồn khác nhau, như XML, Relation database, do đó chúng sẽ được thay đổi liên tục. Để thực hiện việc binding với các Object từ nhiều nguồn khác nhau trong WPF chúng ta sử dụng data source provider.

Object data Provider

Có 2 loại Data source providers mà chúng ta thường xuyên sử dụng trong WPF đó là ObjectDataProvider and XmlDataProvider.

Giả sử chúng ta tạo mới 1 PeopleLoader.cs class để thực hiện khởi tạo các People object như sau:

public class PeopleLoader
    {
        public People LoadPeople()
        {
            People people = new People 
            {
                new Person("Quang", "Nguyen"),
                new Person("Nhat", "Mai"),             
                new Person("Duc", "Le")
            };           
            return people;
        }
    }

Sau đó, chúng ta sẽ sử dụng PeopleLoader class này trong XAML như sau:

ObjectType: chỉ ra class thực hiện cho việc binding

MethodName: chỉ ra tên Method thực hiện việc lấy dữ liệu

<Window x:Class="ObjectBinding.Window1"
       ...
        xmlns:local="clr-namespace:ObjectBinding">
    <Window.Resources>
        <ObjectDataProvider
            x:Key="Hyperlogy"
            ObjectType="{x:Type local:PeopleLoader}" 
            MethodName="LoadPeople">
        </ObjectDataProvider>
    </Window.Resources>
    <Grid Margin="10" Name="grid" DataContext="{StaticResource Hyperlogy}">
        ...
        <ListBox Grid.Column="1" Grid.Row="0" Name="lbPeople" 
                 ItemsSource="{Binding}" 
                 IsSynchronizedWithCurrentItem="True">
            ...
</Window>

Kết quả: chúng ta thấy sẽ không khác hardcoded

image

Object data provider đóng vài trò như thành phần trung gian giữa data và binding. Để thực thi thao tác giữ liệu và binding lên UI, chúng ta cần phải thông qua Object data provider.

Chúng ta thực hiện việc lấy giữ liệu từ Object data provider trước khi xử lý như sau:

...
DataSourceProvider provider =
    (DataSourceProvider)this.FindResource("Hyperlogy");
    People people = (People)provider.Data;
...

Fullcode:

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
 
        ICollectionView GetCompanyView()
        {
            DataSourceProvider provider =
            (DataSourceProvider)this.FindResource("Hyperlogy");
            People people = (People)provider.Data;
            return CollectionViewSource.GetDefaultView(people);
        }
 
        private void btnDisplay_Click(object sender, RoutedEventArgs e)
        {
            ICollectionView view = GetCompanyView();
            Person person = (Person)view.CurrentItem;
            MessageBox.Show(person.FullName);         
        }        
    }

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: