Провайдеры данных. ObjectDataProvider

Последнее обновление: 26.02.2016

Для упрощения работы с источниками данных в 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.

ObjectDataProvider в WPF

Подобным образом можно использовать свойство 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>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850