Для упрощения работы с источниками данных в WPF есть такая функциональность, как провайдеры данных. Они позволяют связывать источники данных и элементы интерфейса. По умолчанию доступно два провайдера данных: ObjectDataProvider (для работы с объектами) и XmlDataProvider (для работы с данными из xml-файлов).
ObjectDataProvider позволяет использовать в качестве базы данных какой-нибудь локальный объект. Для установки подключения к объекту провайдер применяет следующие свойства:
ObjectType: указывает на тип объекта, который будет выполнять роль источника
MethodName: указывает на метод объекта из свойства ObjectType
ObjectInstance: непосредственно сам объект-источник. В приложение можно одновременно использовать только одно из свойств: ObjectType, либо ObjectInstance
IsAsynchronous: при значении true получает данные от источника в асинхронном режиме
К примеру, определим в файле кода класс, который представляет модель данных, и класс, который будет поставлять данные:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class PhoneRepository { private ObservableCollection<Phone> phones; public PhoneRepository() { phones = new ObservableCollection<Phone> { new Phone {Id=1, Title="iPhone 6S", Company="Apple" }, new Phone {Id=2, Title="Lumia 950", Company="Microsoft" }, new Phone {Id=3, Title="Nexus 5X", Company="Google" }, new Phone {Id=4, Title="Galaxy S6", Company="Samsung"} }; } public ObservableCollection<Phone> GetPhones() { return phones; } } public class Phone { public int Id { get; set; } public string Title { get; set; } // модель телефона public string Company { get; set; } // производитель }
Итак, класс окна MainWindow здесь абсолютно пустой, в нем не устанавливается никаких привязок или источников данных.
В качестве модели данных применяется класс Phone, а всю работу по поставке данных берет на себя класс PhoneRepository. Это стандартный репозиторий,
усеченный до одного метода GetPhones()
. Данный метод фактически выполняет роль источника данных.
Теперь в коде разметки xaml определим ObjectDataProvider, который свяжем с PhoneRepository:
<Window x:Class="DataProvidersApp.MainWindow" 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" xmlns:local="clr-namespace:DataProvidersApp" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <ObjectDataProvider x:Key="phonesProvider" ObjectType="{x:Type local:PhoneRepository}" MethodName="GetPhones" /> </Window.Resources> <Grid> <ListBox x:Name="phonesList" DisplayMemberPath="Title" ItemsSource="{Binding Source={StaticResource phonesProvider}}" /> </Grid> </Window>
ObjectDataProvider определяется как обычный ресурс. В качестве типа объекта указываем тип PhoneRepository, а в качестве метода - GetPhones. Таким образом, ObjectDataProvider будет связан с той коллекцией объектов Phone, которая возвращается методом GetPhones.
Затем этот ресурс мы можем использовать как источник данных в элементе ListBox.
Подобным образом можно использовать свойство ObjectInstance класса ObjectDataProvider для определения источника. Для этого для ObjectInstance надо установить ссылку на ресурс - коллекцию объектов:
<Window x:Class="DataProvidersApp.MainWindow" 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" xmlns:local="clr-namespace:DataProvidersApp" xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <col:ArrayList x:Key="phones"> <local:Phone Id="1" Title="Lumia 950" Company="Microsoft" /> <local:Phone Id="2" Title="Elite X3" Company="HP" /> <local:Phone Id="3" Title="Fierce XL" Company="Alcatel" /> </col:ArrayList> <ObjectDataProvider x:Key="phonesProvider" ObjectInstance="{StaticResource phones}" /> </Window.Resources> <Grid> <ListBox x:Name="phonesList" DisplayMemberPath="Title" ItemsSource="{Binding Source={StaticResource phonesProvider}}" /> </Grid> </Window>