다음을 통해 공유


연습: WCF 데이터 서비스에 WPF 컨트롤 바인딩

이 연습에서는 데이터 바인딩된 컨트롤을 포함하는 WPF 응용 프로그램을 만듭니다. 이러한 컨트롤은 WCF Data Service에서 캡슐화된 고객 레코드에 바인딩됩니다. 또한 고객이 레코드를 보고 업데이트하는 데 사용할 수 있는 단추도 추가합니다.

이 연습에서는 다음 작업을 수행합니다.

  • AdventureWorksLT 샘플 데이터베이스의 데이터에서 생성되는 엔터티 데이터 모델을 만듭니다.

  • 엔터티 데이터 모델의 데이터를 WPF 응용 프로그램에 표시하는 WCF Data Service를 만듭니다.

  • 데이터 소스 창에서 WPF 디자이너로 항목을 끌어 데이터 바인딩된 컨트롤 집합을 만듭니다.

  • 고객 레코드를 앞뒤로 탐색하는 데 사용할 단추를 만듭니다.

  • 컨트롤의 데이터 변경 내용을 WCF Data Service 및 기본 데이터 소스에 저장하는 단추를 만듭니다.

    참고

    일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio에서 개발 설정 사용자 지정을 참조하세요.

사전 요구 사항

이 연습을 완료하려면 다음 구성 요소가 필요합니다.

  • Visual Studio

  • AdventureWorksLT 샘플 데이터베이스가 연결된 SQL Server 또는 SQL Server Express의 실행 중인 인스턴스 액세스 권한. AdventureWorksLT 데이터베이스는 CodePlex 웹 사이트에서 다운로드할 수 있습니다.

또한 다음 개념에 대한 지식은 연습을 완료하는 데 반드시 필요하지는 않지만 사전에 파악해 두면 유용할 수 있습니다.

서비스 프로젝트 만들기

이 연습에서는 먼저 WCF Data Service용 프로젝트를 만듭니다.

해당 서비스 프로젝트를 만들려면

  1. Visual Studio를 시작합니다.

  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.

  3. Visual C# 또는 Visual Basic을 확장한 다음 을 선택합니다.

  4. ASP.NET 웹 응용 프로그램 프로젝트 템플릿을 선택합니다.

  5. 이름 상자에 AdventureWorksService를 입력한 다음 확인을 클릭합니다.

    AdventureWorksService 프로젝트가 만들어집니다.

  6. 솔루션 탐색기에서 Default.aspx를 오른쪽 마우스 단추로 클릭하고 삭제를 클릭합니다. 이 연습에서는 해당 파일이 필요하지 않습니다.

서비스에 대한 엔터티 데이터 모델 만들기

WCF Data Service를 사용하여 응용 프로그램에 데이터를 표시하려면 서비스에 대해 데이터 모델을 정의해야 합니다. WCF Data Service에서는 두 가지 데이터 모델 유형이 지원됩니다. 그 중 하나는 엔터티 데이터 모델이고, 다른 하나는 IQueryable 인터페이스를 구현하는 CLR(공용 언어 런타임) 개체를 사용하여 정의하는 사용자 지정 데이터 모델입니다. 이 연습에서는 데이터 모델에 대해 엔터티 데이터 모델을 만듭니다.

엔터티 데이터 모델을 만들려면

  1. 프로젝트 메뉴에서 새 항목 추가를 클릭합니다.

  2. 설치된 템플릿 목록에서 데이터를 클릭하고 ADO.NET 엔터티 데이터 모델 프로젝트 항목을 선택합니다.

  3. 이름을 AdventureWorksModel.edmx로 변경하고 추가를 클릭합니다.

    엔터티 데이터 모델 마법사가 열립니다.

  4. 모델 콘텐츠 선택 페이지에서 데이터베이스에서 생성을 클릭하고 다음을 클릭합니다.

  5. 데이터 연결 선택 페이지에서 다음 옵션 중 하나를 선택합니다.

    • AdventureWorksLT 샘플 데이터베이스에 대한 데이터 연결이 드롭다운 목록에 표시되면 해당 연결을 선택합니다.

      또는

    • 새 연결을 클릭하고 AdventureWorksLT 데이터베이스에 대한 연결을 만듭니다.

  6. 데이터 연결 선택 페이지에서 다른 이름으로 App.Config의 엔터티 연결 설정 저장 옵션이 선택되어 있는지 확인하고 다음을 클릭합니다.

  7. 데이터베이스 개체 선택 페이지에서 테이블을 확장하고 SalesOrderHeader 테이블을 선택합니다.

  8. 마침을 클릭합니다.

서비스 만들기

엔터티 데이터 모델의 데이터를 WPF 응용 프로그램에 표시하는 WCF Data Service 만들기

해당 서비스를 만들려면

  1. 프로젝트 메뉴에서 새 항목 추가를 선택합니다.

  2. 설치된 템플릿 목록에서 을 클릭하고 WCF 데이터 서비스 프로젝트 항목을 선택합니다.

  3. 이름 상자에 AdventureWorksService.svc를 입력한 다음 추가를 클릭합니다.

    AdventureWorksService.svc가 프로젝트에 추가됩니다.

서비스 구성

작성한 엔터티 데이터 모델에 대해 작동하도록 서비스를 구성해야 합니다.

서비스를 구성하려면

  1. AdventureWorks.svc 코드 파일에서 AdventureWorksService 클래스 선언을 다음 코드로 바꿉니다.

    Public Class AdventureWorksService
        Inherits DataService(Of AdventureWorksLTEntities)
    
        ' This method is called only once to initialize service-wide policies. 
        Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration)
            config.SetEntitySetAccessRule("SalesOrderHeaders", EntitySetRights.All)
            config.UseVerboseErrors = True 
        End Sub 
    End Class
    
    public class AdventureWorksService : DataService<AdventureWorksLTEntities>
    {
        // This method is called only once to initialize service-wide policies. 
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("SalesOrderHeaders", EntitySetRights.All);
        }
    }
    

    이 코드는 AdventureWorksService 클래스가 엔터티 데이터 모델의 AdventureWorksLTEntities 개체 컨텍스트 클래스에서 작동하는 DataService에서 파생되도록 업데이트합니다. 또한 서비스의 클라이언트에 SalesOrderHeader 엔터티에 대한 모든 읽기/쓰기 권한을 허용하도록 InitializeService 메서드를 업데이트합니다.

  2. 프로젝트를 빌드하고 오류가 없이 빌드되는지 확인합니다.

WPF 클라이언트 응용 프로그램 만들기

WCF Data Service에서 데이터를 표시하려면 서비스를 기반으로 하는 데이터 소스를 사용하여 새 WPF 응용 프로그램을 만듭니다. 이 연습 뒷부분에서 응용 프로그램에 데이터 바인딩된 컨트롤을 추가합니다.

WPF 클라이언트 응용 프로그램을 만들려면

  1. 솔루션 탐색기에서 솔루션 노드를 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 프로젝트를 선택합니다.

  2. 새 프로젝트 대화 상자에서 Visual C# 또는 Visual Basic을 확장한 다음 Windows를 선택합니다.

  3. WPF 응용 프로그램 프로젝트 템플릿을 선택합니다.

  4. 이름 상자에 AdventureWorksSalesEditor를 입력한 다음 확인을 클릭합니다.

    AdventureWorksSalesEditor 프로젝트가 솔루션에 추가됩니다.

  5. 데이터 메뉴에서 데이터 소스 표시를 클릭합니다.

    데이터 소스 창이 열립니다.

  6. 데이터 소스 창에서 새 데이터 소스 추가를 클릭합니다.

    데이터 소스 구성 마법사가 열립니다.

  7. 마법사의 데이터 소스 형식 선택 페이지에서 서비스를 선택한 후 다음을 클릭합니다.

  8. 서비스 참조 추가 대화 상자에서 검색을 클릭합니다.

    Visual Studio는 현재 사용 가능한 서비스에 대한 솔루션을 검색하고 사용 가능한 서비스 목록의 서비스 상자에 AdventureWorksService.svc를 추가합니다.

  9. 네임스페이스 상자에 AdventureWorksService를 입력합니다.

  10. 서비스 상자에서 AdventureWorksService.svc를 클릭한 다음 확인을 클릭합니다.

    서비스 정보가 다운로드된 다음 데이터 소스 구성 마법사가 다시 표시됩니다.

  11. 서비스 참조 추가 페이지에서 마침을 클릭합니다.

    서비스에서 반환하는 데이터를 나타내는 노드가 데이터 소스 창에 추가됩니다.

창의 사용자 인터페이스 정의

WPF 디자이너에서 XAML을 수정하여 창에 여러 단추를 추가합니다. 이 연습 뒷부분에서 사용자가 이러한 단추를 사용해 판매 레코드를 보고 업데이트할 수 있도록 하는 코드를 추가합니다.

창 레이아웃을 만들려면

  1. 솔루션 탐색기에서 MainWindow.xaml을 두 번 클릭합니다.

    WPF 디자이너에서 창이 열립니다.

  2. 디자이너의 XAML 뷰에서 <Grid> 태그 사이에 다음 코드를 추가합니다.

    <Grid.RowDefinitions>
        <RowDefinition Height="75" />
        <RowDefinition Height="525" />
    </Grid.RowDefinitions>
    <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75">&lt;</Button>
    <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">&gt;</Button>
    <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
    
  3. 프로젝트를 빌드합니다.

데이터 바인딩된 컨트롤 만들기

데이터 소스 창에서 디자이너로 SalesOrderHeaders 노드를 끌어 고객 레코드를 표시하는 컨트롤을 만듭니다.

데이터 바인딩된 컨트롤을 만들려면

  1. 데이터 소스 창에서 SalesOrderHeaders 노드의 드롭다운 메뉴를 클릭하고 정보를 선택합니다.

  2. SalesOrderHeaders 노드를 확장합니다.

  3. 이 예에서는 일부 필드를 표시하지 않을 것이므로 다음 노드 옆의 드롭다운 메뉴를 클릭하고 없음을 선택합니다.

    • CreditCardApprovalCode

    • ModifiedDate

    • OnlineOrderFlag

    • RevisionNumber

    • rowguid

    이 작업을 수행하면 다음 단계에서 이러한 노드에 대해 데이터 바인딩된 컨트롤이 작성되지 않습니다. 이 연습에서는 최종 사용자가 이 데이터를 확인하지 않아도 된다고 가정합니다.

  4. 데이터 소스 창에서 단추가 포함된 행 아래의 데이터 표 행으로 SalesOrderHeaders 노드를 끌어 옵니다.

    Product 테이블의 데이터에 바인딩되는 컨트롤 집합을 만드는 코드와 XAML이 생성됩니다. 생성된 XAML 및 코드에 대한 자세한 내용은 Visual Studio에서 데이터에 WPF 컨트롤 바인딩을 참조하세요.

  5. 디자이너에서 고객 ID 레이블 옆의 텍스트 상자를 클릭합니다.

  6. 속성 창에서 IsReadOnly 속성 옆의 확인란을 선택합니다.

  7. 다음의 각 텍스트 상자에 대해 IsReadOnly 속성을 설정합니다.

    • 구매 주문 번호

    • 판매 주문 ID

    • 판매 주문 번호

서비스에서 데이터 로드

서비스 프록시 개체를 사용하여 서비스에서 판매 데이터를 로드한 다음 반환된 데이터를 WPF 창에서 CollectionViewSource의 데이터 소스에 할당합니다.

서비스에서 데이터를 로드하려면

  1. 디자이너에서 MainWindow 텍스트를 두 번 클릭하여 Window_Loaded 이벤트 처리기를 만듭니다.

  2. 이벤트 처리기를 다음 코드로 바꿉니다. 이 코드의 localhost 주소는 사용 중인 개발 컴퓨터의 로컬 호스트 주소로 바꿔야 합니다.

    Private DataServiceClient As AdventureWorksService.AdventureWorksLTEntities
    Private SalesQuery As System.Data.Services.Client.DataServiceQuery(Of AdventureWorksService.SalesOrderHeader)
    Private OrdersViewSource As CollectionViewSource
    
    Private Sub Window_Loaded(ByVal Sender As Object, ByVal e As RoutedEventArgs) Handles MyBase.Loaded
    
        ' TODO: Modify the port number in the following URI as required.
        DataServiceClient = New AdventureWorksService.AdventureWorksLTEntities( _
        New Uri("https://localhost:32415/AdventureWorksService.svc"))
        SalesQuery = DataServiceClient.SalesOrderHeaders
    
        OrdersViewSource = CType(Me.FindResource("SalesOrderHeadersViewSource"), CollectionViewSource)
        OrdersViewSource.Source = SalesQuery.Execute()
        OrdersViewSource.View.MoveCurrentToFirst()
    End Sub
    
    private AdventureWorksService.AdventureWorksLTEntities dataServiceClient;
    private System.Data.Services.Client.DataServiceQuery<AdventureWorksService.SalesOrderHeader> salesQuery;
    private CollectionViewSource ordersViewSource;
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // TODO: Modify the port number in the following URI as required.
        dataServiceClient = new AdventureWorksService.AdventureWorksLTEntities(
            new Uri("https://localhost:45899/AdventureWorksService.svc"));
        salesQuery = dataServiceClient.SalesOrderHeaders;
    
        ordersViewSource = ((CollectionViewSource)(this.FindResource("salesOrderHeadersViewSource")));
        ordersViewSource.Source = salesQuery.Execute();
        ordersViewSource.View.MoveCurrentToFirst();
    }
    

판매 레코드 탐색

사용자가 <> 단추를 사용하여 판매 레코드를 스크롤할 수 있도록 하는 코드를 추가합니다.

사용자가 판매 레코드를 탐색할 수 있도록 설정하려면

  1. 디자이너의 창 화면에서 < 단추를 두 번 클릭합니다.

    코드 숨김 파일이 열리고 Click 이벤트에 대해 새 backButton_Click 이벤트 처리기가 만들어집니다.

  2. 다음 코드를 생성된 backButton_Click 이벤트 처리기에 추가합니다.

    If OrdersViewSource.View.CurrentPosition > 0 Then
        OrdersViewSource.View.MoveCurrentToPrevious()
    End If
    
    if (ordersViewSource.View.CurrentPosition > 0)
        ordersViewSource.View.MoveCurrentToPrevious();
    
  3. 디자이너로 돌아온 다음 > 단추를 두 번 클릭합니다.

    코드 숨김 파일이 열리고 Click 이벤트에 대해 새 nextButton_Click 이벤트 처리기가 만들어집니다.

  4. 다음 코드를 생성된 nextButton_Click 이벤트 처리기에 추가합니다.

    If OrdersViewSource.View.CurrentPosition < CType(OrdersViewSource.View, CollectionView).Count - 1 Then
        OrdersViewSource.View.MoveCurrentToNext()
    End If
    
    if (ordersViewSource.View.CurrentPosition < ((CollectionView)ordersViewSource.View).Count - 1)
    {
        ordersViewSource.View.MoveCurrentToNext();
    }
    

판매 레코드 변경 내용 저장

사용자가 변경 내용 저장 단추를 사용하여 판매 레코드 변경 내용을 확인 및 저장할 수 있도록 하는 코드를 추가합니다.

판매 레코드 변경 내용을 저장하는 기능을 추가하려면

  1. 디자이너에서 변경 내용 저장 단추를 두 번 클릭합니다.

    코드 숨김 파일이 열리고 Click 이벤트에 대해 새 saveButton_Click 이벤트 처리기가 만들어집니다.

  2. 다음 코드를 saveButton_Click 이벤트 처리기에 추가합니다.

    Dim CurrentOrder As AdventureWorksService.SalesOrderHeader = CType(OrdersViewSource.View.CurrentItem, AdventureWorksService.SalesOrderHeader)
    
    DataServiceClient.UpdateObject(CurrentOrder)
    DataServiceClient.SaveChanges()
    
    AdventureWorksService.SalesOrderHeader currentOrder = (AdventureWorksService.SalesOrderHeader)ordersViewSource.View.CurrentItem;
    dataServiceClient.UpdateObject(currentOrder);
    dataServiceClient.SaveChanges();
    

응용 프로그램 테스트

응용 프로그램을 빌드하고 실행하여 고객 레코드를 보고 업데이트할 수 있는지 확인합니다.

응용 프로그램을 테스트하려면

  1. 빌드 메뉴에서 솔루션 빌드를 클릭합니다. 솔루션이 오류 없이 빌드되는지 확인합니다.

  2. Ctrl+F5를 누릅니다.

    AdventureWorksService 프로젝트가 디버그되지 않고 시작됩니다.

  3. 솔루션 탐색기에서 AdventureWorksSalesEditor 프로젝트를 마우스 오른쪽 단추로 클릭합니다.

  4. 상황에 맞는 메뉴의 디버그에서 새 인스턴스 시작을 클릭합니다.

    응용 프로그램이 실행됩니다. 다음 사항을 확인합니다.

    • 판매 주문 ID가 71774인 첫 번째 판매 레코드의 서로 다른 데이터 필드가 텍스트 상자에 표시됩니다.

    • > 또는 < 단추를 클릭하여 다른 판매 레코드를 탐색할 수 있습니다.

  5. 판매 레코드 중 하나의 설명 상자에 텍스트를 입력하고 변경 내용 저장을 클릭합니다.

  6. 응용 프로그램을 닫았다가 Visual Studio에서 다시 시작합니다.

  7. 변경한 판매 레코드로 이동하여 응용 프로그램을 닫았다가 다시 열어도 변경 내용이 그대로 유지되는지 확인합니다.

  8. 응용 프로그램을 닫습니다.

다음 단계

이 연습을 완료하고 나면 다음과 같은 관련 작업을 수행할 수 있습니다.

참고 항목

작업

방법: Visual Studio에서 데이터에 WPF 컨트롤 바인딩

연습: 데이터 집합에 WPF 컨트롤 바인딩

개념

Visual Studio에서 데이터에 WPF 컨트롤 바인딩

WCF Data Services 개요

Entity Framework 개요

데이터 바인딩 개요

기타 리소스

WPF Designer Overview