Thứ Sáu, 24 tháng 7, 2009

WPF: Data Source Providers (Object)

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



A21319952F68E79E_426_0[4]



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ả:



A21319952F68E79E_426_1[4]

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

Đăng nhận xét