방법: XDocument, XElement 또는 LINQ for XML 쿼리 결과에 바인딩

이 예제에서는 XDocument를 사용하여 XML 데이터를 ItemsControl에 바인딩하는 방법을 보여 줍니다.

예제

다음 XAML 코드는 ItemsControl을 정의하고 http://planetsNS XML 네임스페이스에서 Planet 유형의 데이터에 대한 데이터 템플릿을 포함합니다. 네임스페이스를 차지하는 XML 데이터 형식은 중괄호에서 네임스페이스를 포함해야 하고 XAML 태그 확장이 표시되는 위치에 표시되는 경우 중괄호 이스케이프 시퀀스를 가진 네임스페이스 앞에 표시되어야 합니다. 이 코드는 XElement 클래스의 ElementAttribute 메서드에 해당하는 동적 속성에 바인딩합니다. 동적 속성을 사용하면 XAML을 메서드의 이름을 공유하는 동적 속성에 바인딩할 수 있습니다. 자세한 내용은 LINQ to XML 동적 속성을 참조하세요. XML의 기본 네임스페이스 선언이 특성 이름에 적용되지 않는지를 확인합니다.

<StackPanel Name="stacky">
  <StackPanel.Resources>
    <DataTemplate DataType="{}{http://planetsNS}Planet" >
      <StackPanel Orientation="Horizontal">
        <TextBlock Width="100" Text="{Binding Path=Element[{http://planetsNS}DiameterKM].Value}" />
        <TextBlock Width="100" Text="{Binding Path=Attribute[Name].Value}" />
        <TextBlock Text="{Binding Path=Element[{http://planetsNS}Details].Value}" /> 
      </StackPanel>
    </DataTemplate>
  </StackPanel.Resources>
  <ItemsControl 
    ItemsSource="{Binding }" >
  </ItemsControl>
</StackPanel>

다음 C# 코드는 Load를 호출하고 http://planetsNS XML 네임스페이스에서 스택 패널 데이터 컨텍스트를 SolarSystemPlanets라는 요소의 모든 하위 요소로 설정합니다.

planetsDoc = XDocument.Load("../../Planets.xml");
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = XDocument.Load("../../Planets.xml")
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()

XML 데이터는 ObjectDataProvider를 사용하여 XAML 리소스로 저장할 수 있습니다. 전체 예제는 L2DBForm.xaml 소스 코드를 참조하세요. 다음 샘플에서는 코드가 데이터 컨텍스트를 개체 리소스로 설정하는 방법을 보여 줍니다.

planetsDoc = (XDocument)((ObjectDataProvider)Resources["justTwoPlanets"]).Data;
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = CType((CType(Resources("justTwoPlanets"), ObjectDataProvider)).Data, XDocument)
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()

ElementAttribute에 매핑되는 동적 속성은 XAML 내에서 유연성을 제공합니다. 코드는 LINQ for XML 쿼리의 결과에 바인딩될 수도 있습니다. 이 예제는 요소 값으로 정렬된 쿼리 결과에 바인딩됩니다.

stacky.DataContext =
from c in planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
orderby Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
select c;
stacky.DataContext = From c In planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
                     Order By Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
                     Select c

참고 항목