EntityChangedParams 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
대리자의 인수를 캡슐화합니다 PropertyChanged .
public ref class EntityChangedParams sealed
public sealed class EntityChangedParams
type EntityChangedParams = class
Public NotInheritable Class EntityChangedParams
- 상속
-
EntityChangedParams
예제
XAML 파일에 대한 다음 코드 숨김 페이지에서는 바인딩 컬렉션에 바인딩된 데이터를 변경할 때 호출되는 사용자 지정 메서드를 만듭니다 DataServiceCollection<T> .
CollectionChanged 이벤트가 발생하면 제공된 메서드는 바인딩 컬렉션에서 제거된 항목이 데이터 서비스에서 삭제되지 않도록 방지합니다.
PropertyChanged 이벤트가 발생하면 값의 ShipDate 유효성이 검사되어 이미 배송된 주문이 변경되지 않았는지 확인합니다.
using System;
using System.Collections.Specialized;
using System.Data.Services.Client;
using System.Linq;
using System.Windows;
using NorthwindClient.Northwind;
namespace NorthwindClient
{
public partial class CustomerOrdersCustom : Window
{
private NorthwindEntities context;
private DataServiceCollection<Customer> trackedCustomers;
private const string customerCountry = "Germany";
private const string svcUri = "http://localhost:12345/Northwind.svc/";
public CustomerOrdersCustom()
{
//InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
// Initialize the context for the data service.
context = new NorthwindEntities(new Uri(svcUri));
// Create a LINQ query that returns customers with related orders.
var customerQuery = from cust in context.Customers.Expand("Orders")
where cust.Country == customerCountry
select cust;
// Create a new collection for binding based on the LINQ query.
trackedCustomers = new DataServiceCollection<Customer>(customerQuery,
TrackingMode.AutoChangeTracking,"Customers",
OnPropertyChanged, OnCollectionChanged);
// Bind the root StackPanel element to the collection;
// related object binding paths are defined in the XAML.
LayoutRoot.DataContext = trackedCustomers;
}
catch (DataServiceQueryException ex)
{
MessageBox.Show("The query could not be completed:\n" + ex.ToString());
}
catch (InvalidOperationException ex)
{
MessageBox.Show("The following error occurred:\n" + ex.ToString());
}
}
// Method that is called when the CollectionChanged event is handled.
private bool OnCollectionChanged(
EntityCollectionChangedParams entityCollectionChangedinfo)
{
if (entityCollectionChangedinfo.Action ==
NotifyCollectionChangedAction.Remove)
{
// Delete the related items when an order is deleted.
if (entityCollectionChangedinfo.TargetEntity.GetType() == typeof(Order))
{
// Get the context and object from the supplied parameter.
DataServiceContext context = entityCollectionChangedinfo.Context;
Order deletedOrder = entityCollectionChangedinfo.TargetEntity as Order;
if (deletedOrder.Order_Details.Count == 0)
{
// Load the related OrderDetails.
context.LoadProperty(deletedOrder, "Order_Details");
}
// Delete the order and its related items;
foreach (Order_Detail item in deletedOrder.Order_Details)
{
context.DeleteObject(item);
}
// Delete the order and then return true since the object is already deleted.
context.DeleteObject(deletedOrder);
return true;
}
else
{
return false;
}
}
else
{
// Use the default behavior.
return false;
}
}
// Method that is called when the PropertyChanged event is handled.
private bool OnPropertyChanged(EntityChangedParams entityChangedInfo)
{
// Validate a changed order to ensure that changes are not made
// after the order ships.
if ((entityChangedInfo.Entity.GetType() == typeof(Order)) &&
((Order)(entityChangedInfo.Entity)).ShippedDate < DateTime.Today)
{
throw new ApplicationException(string.Format(
"The order {0} cannot be changed because it shipped on {1}.",
((Order)(entityChangedInfo.Entity)).OrderID,
((Order)(entityChangedInfo.Entity)).ShippedDate));
}
return false;
}
private void deleteButton_Click(object sender, RoutedEventArgs e)
{
if (customerIDComboBox.SelectedItem != null)
{
// Get the Orders binding collection.
DataServiceCollection<Order> trackedOrders =
((Customer)(customerIDComboBox.SelectedItem)).Orders;
// Remove the currently selected order.
trackedOrders.Remove((Order)(ordersDataGrid.SelectedItem));
}
}
private void saveChangesButton_Click(object sender, RoutedEventArgs e)
{
try
{
// Save changes to the data service.
context.SaveChanges();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
Imports System.Collections.Specialized
Imports System.Data.Services.Client
Imports System.Windows
Imports northwindclientvb.Northwind
Partial Public Class CustomerOrdersCustom
Inherits Window
Private context As NorthwindEntities
'Private trackedCustomers As DataServiceCollection(Of Customer)
'Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Try
' ' Initialize the context for the data service.
' context = New NorthwindEntities(New Uri(SvcUri))
' '<snippetMasterDetailBinding>
' ' Create a LINQ query that returns customers with related orders.
' Dim customerQuery = From cust In context.Customers.Expand("Orders")
' Where cust.Country = CustomerCountry
' Select cust
' ' Create a new collection for binding based on the LINQ query.
' trackedCustomers = New DataServiceCollection(Of Customer)(customerQuery,
' TrackingMode.AutoChangeTracking, "Customers",
' AddressOf OnMyPropertyChanged, AddressOf OnMyCollectionChanged)
' ' Bind the root StackPanel element to the collection
' ' related object binding paths are defined in the XAML.
' Me.LayoutRoot.DataContext = trackedCustomers
' '</snippetMasterDetailBinding>
' Catch ex As DataServiceQueryException
' MessageBox.Show("The query could not be completed:\n" + ex.ToString())
' Catch ex As InvalidOperationException
' MessageBox.Show("The following error occurred:\n" + ex.ToString())
' End Try
'End Sub
' Method that is called when the CollectionChanged event is handled.
'Private Function OnMyCollectionChanged( _
' ByVal entityCollectionChangedinfo As EntityCollectionChangedParams) As Boolean
' If entityCollectionChangedinfo.Action = _
' NotifyCollectionChangedAction.Remove Then
' ' Delete the related items when an order is deleted.
' If entityCollectionChangedinfo.TargetEntity.GetType() Is GetType(Order) Then
' ' Get the context and object from the supplied parameter.
' Dim context = entityCollectionChangedinfo.Context
' Dim deletedOrder As Order = _
' CType(entityCollectionChangedinfo.TargetEntity, Order)
' If deletedOrder.Order_Details.Count = 0 Then
' ' Load the related OrderDetails.
' context.LoadProperty(deletedOrder, "Order_Details")
' End If
' ' Delete the order and its related items
' For Each item As Order_Detail In deletedOrder.Order_Details
' context.DeleteObject(item)
' Next
' ' Delete the order and then return false since the object is already deleted.
' context.DeleteObject(deletedOrder)
' Return True
' Else
' Return False
' End If
' Else
' ' Use the default behavior.
' Return False
' End If
'End Function
'' Method that is called when the PropertyChanged event is handled.
'Private Function OnMyPropertyChanged(
'ByVal entityChangedInfo As EntityChangedParams) As Boolean
' ' Validate a changed order to ensure that changes are not made
' ' after the order ships.
' If entityChangedInfo.Entity.GetType() Is GetType(Order) AndAlso
' (CType(entityChangedInfo.Entity, Order).ShippedDate < DateTime.Today) Then
' Throw New ApplicationException(String.Format(
' "The order {0} cannot be changed because it shipped on {1}.",
' CType(entityChangedInfo.Entity, Order).OrderID,
' CType(entityChangedInfo.Entity, Order).ShippedDate))
' Return False
' Else
' Return True
' End If
'End Function
'Private Sub deleteButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' ' Get the Orders binding collection.
' If customerIDComboBox.SelectedItem IsNot Nothing Then
' Dim trackedOrders As DataServiceCollection(Of Order) = _
' (CType(customerIDComboBox.SelectedItem, Customer)).Orders
' ' Remove the currently selected order.
' trackedOrders.Remove(CType(ordersDataGrid.SelectedItem, Order))
' End If
'End Sub
'Private Sub saveChangesButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Try
' ' Save changes to the data service.
' context.SaveChanges()
' Catch ex As Exception
' MessageBox.Show(ex.ToString())
' End Try
'End Sub
End Class
Imports System.Collections.Specialized
Imports System.Data.Services.Client
Imports System.Linq
Imports System.Windows
Imports northwindclientvb.Northwind
Imports northwindclientvb.NorthwindModel
Partial Public Class CustomerOrdersCustom
Inherits Window
Private _context As Northwind.NorthwindEntities
Private _trackedCustomers As DataServiceCollection(Of Customer)
Private Const CustomerCountry As String = "Germany"
Private Const SvcUri As String = "http://localhost:12345/Northwind.svc/"
Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
Try
' Initialize the context for the data service.
context = New Northwind.NorthwindEntities(New Uri(SvcUri))
' Create a LINQ query that returns customers with related orders.
Dim customerQuery = From cust In context.Customers.Expand("Orders")
Where cust.Country = CustomerCountry
Select cust
' Create a new collection for binding based on the LINQ query.
_trackedCustomers = New DataServiceCollection(Of Customer)(customerQuery,
TrackingMode.AutoChangeTracking, "Customers",
AddressOf OnMyPropertyChanged, AddressOf OnMyCollectionChanged)
' Bind the root StackPanel element to the collection
' related object binding paths are defined in the XAML.
Me.LayoutRoot.DataContext = _trackedCustomers
Me.LayoutRoot.UpdateLayout()
Catch ex As DataServiceQueryException
MessageBox.Show("The query could not be completed:\n" + ex.ToString())
Catch ex As InvalidOperationException
MessageBox.Show("The following error occurred:\n" + ex.ToString())
End Try
End Sub
' Method that is called when the CollectionChanged event is handled.
Private Function OnMyCollectionChanged( _
ByVal entityCollectionChangedinfo As EntityCollectionChangedParams) As Boolean
If entityCollectionChangedinfo.Action = _
NotifyCollectionChangedAction.Remove Then
' Delete the related items when an order is deleted.
If entityCollectionChangedinfo.TargetEntity.GetType() Is GetType(Orders) Then
' Get the context and object from the supplied parameter.
Dim context = entityCollectionChangedinfo.Context
Dim deletedOrder As Orders = _
CType(entityCollectionChangedinfo.TargetEntity, Orders)
' Load the related OrderDetails.
context.LoadProperty(deletedOrder, "Order_Details")
' Delete the order and its related items
For Each item As Order_Details In deletedOrder.Order_Details
'context.DeleteLink(deletedOrder, "Order_Details", item)
context.DeleteObject(item)
Next
' Delete the order and then return false since the object is already deleted.
context.DeleteObject(deletedOrder)
Return False
Else
Return True
End If
Else
' Use the default behavior.
Return True
End If
End Function
' Method that is called when the PropertyChanged event is handled.
Private Function OnMyPropertyChanged(
ByVal entityChangedInfo As EntityChangedParams) As Boolean
' Validate a changed order to ensure that changes are not made
' after the order ships.
If entityChangedInfo.Entity.GetType() Is GetType(Orders) AndAlso
(CType(entityChangedInfo.Entity, Orders).ShippedDate < DateTime.Today) Then
Throw New ApplicationException(String.Format(
"The order {0} cannot be changed because it shipped on {1}.",
CType(entityChangedInfo.Entity, Orders).OrderID,
CType(entityChangedInfo.Entity, Orders).ShippedDate))
End If
Return True
End Function
Private Sub deleteButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Get the Orders binding collection.
Dim trackedOrders As DataServiceCollection(Of Orders) = _
(CType(customerIDComboBox.SelectedItem, Customers)).Orders
' Remove the currently selected order.
trackedOrders.Remove(CType(ordersDataGrid.SelectedItem, Orders))
End Sub
Private Sub saveChangesButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Try
' Save changes to the data service.
context.SaveChanges()
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub
End Class
다음 XAML 코드는 이전 예제의 창을 정의합니다.
<Window x:Class="CustomerOrdersCustom"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Height="423" Width="679" Loaded="Window_Loaded" >
<StackPanel Orientation="Vertical" Height="Auto" Name="LayoutRoot" Width="Auto">
<Label Content="Customer ID" Margin="20,0,0,0" />
<ComboBox Name="customerIDComboBox" DisplayMemberPath="CustomerID" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True" SelectedIndex="0" Height="23" Width="120"
HorizontalAlignment="Left" Margin="20,0,0,0" VerticalAlignment="Center" />
<ListView ItemsSource="{Binding Path=Orders}" Name="ordersDataGrid" Margin="34,46,34,50">
<ListView.View>
<GridView AllowsColumnReorder="False" ColumnHeaderToolTip="Line Items">
<GridViewColumn DisplayMemberBinding="{Binding Path=OrderID, Mode=OneWay}"
Header="Order ID" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=OrderDate, Mode=TwoWay}"
Header="Order Date" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=Freight, Mode=TwoWay}"
Header="Freight Cost" Width="50"/>
</GridView>
</ListView.View>
</ListView>
<StackPanel Orientation="Horizontal">
<Button Name="deleteButton" Content="Delete Order" Click="deleteButton_Click"
Width="80" Height="30" Margin="450,0,10,0"/>
<Button Name="saveChangesButton" Content="Save Changes" Click="saveChangesButton_Click"
Width="80" Height="30" Margin="10,0,0,0"/>
</StackPanel>
</StackPanel>
</Window>
속성
| Name | Description |
|---|---|
| Context |
변경된 엔터티 개체와 연결된 컨텍스트입니다. |
| Entity |
변경된 엔터티 개체입니다. |
| PropertyName |
대상 개체를 참조하는 엔터티 개체의 속성 이름입니다. |
| PropertyValue |
엔터티 개체의 변경된 속성에서 현재 참조하는 개체입니다. |
| SourceEntitySet |
원본 개체의 엔터티 집합입니다. |
| TargetEntitySet |
대상 엔터티 개체가 속한 엔터티 집합입니다. |
메서드
| Name | Description |
|---|---|
| Equals(Object) |
지정한 개체와 현재 개체가 같은지 여부를 확인합니다. (다음에서 상속됨 Object) |
| GetHashCode() |
기본 해시 함수로 작동합니다. (다음에서 상속됨 Object) |
| GetType() |
현재 인스턴스의 Type 가져옵니다. (다음에서 상속됨 Object) |
| MemberwiseClone() |
현재 Object단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
| ToString() |
현재 개체를 나타내는 문자열을 반환합니다. (다음에서 상속됨 Object) |