2012-06-08 4 views
2

Google에서 일부 검색을 수행하고 있지만 비슷한 질문을 여기에서 읽고 있지만 아직 내 대답에 대한 답변을 찾지 못했습니다. xml 파일을 WPF의 treeview 컨트롤에 바인딩하고 있습니다. this 기사를 사용하면 내 xml 파일로 양방향 데이터 바인딩을 쉽게 설정할 수 있습니다.WPF에서 treeview에 xml 문서를 프로그래밍 방식으로 바인딩

그러나 첨부하기 전에 XML 문서에 정렬을 적용하고 싶습니다. 작업에 시작일과 마감일이 포함 된 작업 구성도를 모델링하고 있으며 가장 긴급한 작업이 먼저 표시되도록 마감일을 보류하여 노드를 주문하고 싶습니다. Linq XML에 대한 경험이 있지만 바인딩 문제에 접근하는 방법을 잘 모릅니다. 이견있는 사람? 좀 더 읽기가 여기 내 의사 코드 후

그래서 :

  • 가에서 새 XmlDataProvider를 만들기 때문에 작업 날짜를 기준으로 내 로컬 XML 파일에서하여 XDocument를
  • 정렬하여 XDocument 만들기 새로 트 리뷰에 바인딩
  • 하여 XDocument를 분류

이 사람이 날이 플러시 도와 드릴까요?

+0

귀하의 질문은 질문 제목에 맞지 않습니다. 이 XML 파일 정렬 또는 TreeView 바인딩? 귀하의 질문은 XML에 관한 것이지 WPF에 관한 것이 아닙니다. 분류가 끝나면 나중에 바인드하고 바인딩이 이미 작동한다고 말한 것에서 바인딩하려고합니다. –

+0

미안하지만 설명이 필요합니다. linq를 사용하여 XML 문서를 쉽게 정렬 할 수 있지만 일단 정렬되고 메모리에 저장되면 어떻게 트리 뷰에 바인딩합니까? –

답변

3

다음은 XML을 TreeView 바인딩에 구현하는 방법에 대한 기본 예제입니다. XmlDataProvider를 사용하면 XML 문서를로드하고 바인딩 할 수 있습니다. HierarchicalDataTemplate을 사용하면 하위 항목이있는 TreeView 템플릿을 정의 할 수 있습니다. XPath는 Path 대신 바인드해야하며 @ 기호 접두사는 속성에 바인딩됨을 나타냅니다.

<Window x:Class="Testing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <XmlDataProvider x:Key="people" XPath="People" /> 

     <HierarchicalDataTemplate x:Key="colorsTemplate"> 
      <TextBox Text="{Binding [email protected], Mode=TwoWay}" /> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate x:Key="rootTemplate" ItemsSource="{Binding XPath=FavoriteColors/Color}" ItemTemplate="{StaticResource colorsTemplate}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBox Text="{Binding [email protected], Mode=TwoWay}" /> 
       <TextBlock Text=" " /> 
       <TextBox Text="{Binding [email protected], Mode=TwoWay}" /> 
       <TextBlock Text=" (Age: " /> 
       <TextBox Text="{Binding [email protected], Mode=TwoWay}" /> 
       <TextBlock Text=")" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

    </Window.Resources> 
    <Grid> 
     <TreeView ItemsSource="{Binding Source={StaticResource people}, XPath=Person}" ItemTemplate="{StaticResource rootTemplate}" Grid.ColumnSpan="2" /> 
    </Grid> 
</Window> 
다음 XML 파일을 사용하여

:

<?xml version="1.0" encoding="utf-8" ?> 
<People> 
    <Person FirstName="Ringo" LastName="Starr" Age="72"> 
    <FavoriteColors /> 
    </Person> 
    <Person FirstName="George" LastName="Harrison" Age="52"> 
    <FavoriteColors> 
     <Color Name="Orange" /> 
     <Color Name="Green" /> 
     <Color Name="Purple" /> 
    </FavoriteColors> 
    </Person> 
    <Person FirstName="Paul" LastName="McCartney" Age="42"> 
    <FavoriteColors> 
     <Color Name="White" /> 
    </FavoriteColors> 
    </Person> 
    <Person FirstName="John" LastName="Lennon" Age="33"> 
    <FavoriteColors> 
     <Color Name="Red" /> 
     <Color Name="Green" /> 
    </FavoriteColors> 
    </Person> 
</People> 

을 그리고 다음 코드 숨김 :

XmlDataProvider people; 

public MainWindow() 
{ 
    InitializeComponent(); 

    people = FindResource("people") as XmlDataProvider; 

    var xmlDocument = new XmlDocument(); 

    xmlDocument.Load("People.xml"); 

    people.Document = xmlDocument; 
} 

할 수 있도록, 내가 코드에서 XML 문서를로드하고 볼 수 있듯이 그것을 XDocument 또는 XmlDocument 클래스에로드하고 원하는 방식으로 정렬하십시오. 그런 다음 어떤 시점에서 다시 파일에 저장할 수 있어야합니다.

편집 :

다음로드의 예입니다 런타임에 저장하기 :

private void Load_Click(object sender, RoutedEventArgs e) 
{ 
    var xmlDocument = new XmlDocument(); 

    xmlDocument.Load("People.xml"); 

    people.Document = xmlDocument; 
} 

private void Save_Click(object sender, RoutedEventArgs e) 
{ 
    XmlDocument xml = people.Document; 

    if (xml != null) 
    { 
     Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog(); 

     if ((bool)sfd.ShowDialog(this)) 
     { 
      xml.Save(sfd.FileName); 
     } 
    } 
} 
+0

이것은 매우 멋지지만 좀 더 일반적인 것으로 만들 수 있을지 궁금합니다. 즉, * any * xml 파일에 대해 어떻게이 작업을 수행하겠습니까? 속성 (예 : FirstName)을 알 수없고 매번 다를 수 있다면'{XPath = @ FirstName, Mode = TwoWay} '를 어떻게 처리하겠습니까? (당신이 원하면 직접 질문을 드리겠습니다.) –

관련 문제