Привязка объектов к элементам управления (платформа Entity Framework)
Службы объектов позволяют привязывать такие элементы управления, как ComboBox, ListView и DataGridView, к объектам EntityCollection или ObjectResult, возвращаемым при выполнении метода ObjectQuery. Оба класса Entity Framework реализовывают интерфейс IListSource для привязки данных. Все объекты сущности происходят от базового класса StructuralObject, который реализовывает интерфейс INotifyPropertyChanged. Это позволяет обеспечить двустороннюю привязку данных между свойствами объекта и элементами управления, благодаря чему обновления в элементах управления распространяются в обратном направлении на свойства привязанного объекта.
Чтобы выполнить привязку объектов к элементу управления Windows Form, задайте свойство DataSource элемента управления, равное значению EntityCollection или ObjectResult, возвращаемому при вызове метода Execute применительно к объекту ObjectQuery. В следующем примере показана привязка коллекции EntityCollection к элементу управления DataGridView:
' Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetail
// Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetail;
Дополнительные сведения см. в разделе Как привязать объекты к элементам управления Windows Form (платформа Entity Framework).
Можно создавать источники данных на основании объектов из приложения Visual Studio. После того как в проекте будет определен тип сущности как источник данных, появляется возможность создавать формы, отображающие данные из модели EDM, путем простого перетаскивания элементов из окна Источники данных в формы. Эти элементы становятся в форме элементами управления, привязанными к источнику данных. Дополнительные сведения см. в разделе Data Sources Window. Во время выполнения результат вызова типизированного объекта ObjectQuery присваивается свойству DataSource объекта BindingSource, который используется источником данных. Это приводит к отображению в элементах управления свойств объектов, возвращаемых запросом. Как и при прямой привязке данных, при вызове метода SaveChanges обновления, внесенные в значения элементов управления, применяются к источнику данных. Дополнительные сведения см. в разделе Как добавить объект в качестве источника данных проекта (платформа Entity Framework).
Чтобы выполнить привязку объектов к элементу управления WPF, задайте свойство DataContext элемента управления, равное значению EntityCollection или ObjectResult, возвращаемому при вызове метода Execute применительно к объекту ObjectQuery. Используйте свойство ItemsSource, чтобы задать источник объекта для элемента управления. Если осуществляется привязка элемента управления к связанному объекту, возвращаемому свойством навигации, включите в привязку путь, определенный для свойства ItemsSource. Этот путь определяется относительно корневого объекта, заданного свойством DataContext родительского элемента управления. В следующем примере задается свойство DataContext элемента управления Grid для привязки элемента управления к объекту ObjectResult:
' Execute the query and bind the result to the OrderItems control.
Me.orderItemsGrid.DataContext = query.Execute(MergeOption.AppendOnly)
// Execute the query and bind the result to the OrderItems control.
this.orderItemsGrid.DataContext = query.Execute(MergeOption.AppendOnly);
В следующем примере показано определение привязки дочерних элементов управления ListView и ComboBox на языке XAML:
<ComboBox DisplayMemberPath="SalesOrderID" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="true"
Height="23" Margin="122,12,198,0" Name="comboBoxOrder" VerticalAlignment="Top"/>
<ListView ItemsSource="{Binding Path=SalesOrderDetail}" Name="listViewItems" Margin="34,46,34,50">
<ListView.View>
<GridView AllowsColumnReorder="False" ColumnHeaderToolTip="Line Items">
<GridViewColumn DisplayMemberBinding="{Binding Path=ProductID}"
Header="Product" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=OrderQty}"
Header="Quantity" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=UnitPrice}"
Header="Cost" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=LineTotal}"
Header="Line Total" Width="80"/>
</GridView>
</ListView.View>
</ListView>
Дополнительные сведения см. в разделе Как выполнить привязку объектов к элементам управления WPF (платформа Entity Framework).
Технология Entity Framework предусматривает использование элемента управления веб-сервером EntityDataSource. Можно использовать элемент управления источником данных ASP.NET для привязки результатов запросов объектов к элементам управления на веб-странице ASP.NET. Дополнительные сведения см. в разделе EntityDataSource control example.
При привязке объектов к элементам управления необходимо руководствоваться следующими соображениями.
Не рекомендуется привязывать элементы управления непосредственно к ObjectQuery. Вместо этого лучше привязывать элементы управления к результату метода Execute. Привязка, выполняемая таким образом, исключает возможность многократного выполнения запроса во время привязки.
В следующем примере показана привязка элемента управления ComboBox к объекту ObjectResult, возвращаемому после вызова на выполнение метода ObjectQuery типа SalesOrderHeader:
' Create a query for orders that includes line items. Dim orderQuery As ObjectQuery(Of SalesOrderHeader) = _ context.SalesOrderHeader _ .Where("it.CustomerID = @customerId", _ New ObjectParameter("customerId", customerId)) _ .Include("SalesOrderDetail") ' Bind the combo box to the ObjectResult of SalesOrderHeader ' that is returned when the query is executed. Me.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly)
// Create a query for orders that includes line items. ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeader .Where("it.CustomerID = @customerId", new ObjectParameter("customerId", customerId)) .Include("SalesOrderDetail"); // Bind the combo box to the ObjectResult of SalesOrderHeader // that is returned when the query is executed. this.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly);
Чтобы убедиться в том, что источник данных находится в актуальном состоянии, может потребоваться выполнить этот запрос еще раз, с использованием метода Execute. Это приведет к привязке элемента управления к новому объекту ObjectResult. Такое действие по проверке актуального состояния данных объекта необходимо осуществлять в следующих случаях
Внесены изменения в тот же объект ObjectContext за пределами связанного элемента управления.
Внесены изменения в данные в источнике данных.
Осуществлен возврат объектов с использованием параметра NoTracking.
Предусмотрена возможность получения доступа к отдельным объектам сущности из элемента управления после того, как произошла привязка данных. Но из связанного элемента управления нельзя получить доступ к коллекции. Дополнительные сведения см. в разделе Как привязать объекты к элементам управления Windows Form (платформа Entity Framework).
Можно выполнить привязку объекта EntityCollection к элементу управления, поскольку он реализовывает интерфейс IListSource. Но после выполнения метода OfType применительно к EntityCollection для возврата коллекции объектов производного типа невозможно привязать возвращаемый объект IEnumerable непосредственно к элементу управления. Чтобы привязать элемент управления к коллекции объектов производного типа, полученной из объекта EntityCollection, следует использовать метод CreateSourceQuery для получения объекта ObjectQuery, который определяет базовый объект EntityCollection. Можно выполнить привязку элемента управления к результатам выполнения метода ObjectQuery, возвращаемым в результате применения метода OfType к объекту ObjectQuery.
См. также
Основные понятия
Методы проекций и ограничений (LINQ to Entities)
Другие ресурсы
Работа с объектами (платформа Entity Framework)
Пошаговое руководство: создание веб-приложения Course Manager