XML 속성을 treeView 노드에 바인딩하는 방법, XDocument wpf treeView에 대한 데이터베인딩

StackOverflow https://stackoverflow.com/questions/238196

문제

나는 데이터가 필요한 XML이 있습니다. wpf treeview. 여기서 XML은 다른 구조를 가질 수 있습니다. TreeView는 계층 구조의 순열을로드 할 수있을 정도로 데이터 라운드 일반이어야합니다. 그러나 an xattribute 노드에서 (호출 제목)는 TreeViewItem의 데이터 라운드 여야합니다 헤더 텍스트 그리고 Nodename이 아닙니다.

바인딩되는 XML :

<Wizard>
  <Section Title="Home">
    <Loop Title="Income Loop">
      <Page Title="Employer Income"/>
      <Page Title="Parttime Job Income"/>
      <Page Title="Self employment Income"/>
    </Loop>
  </Section>
  <Section Title="Deductions">
    <Loop Title="Deductions Loop">
      <Page Title="Travel spending"/>
      <Page Title="Charity spending"/>
      <Page Title="Dependents"/>
    </Loop>
  </Section>
</Wizard>

XAML :

<Window x:Class="Wpf.DataBinding.TreeViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Wpf.DataBinding"
    Title="TreeViewer" Height="300" Width="300">
    <Window.Resources>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Elements}" x:Key="TVTemplate">
            <TreeViewItem Header="{Binding Path=Name}"/>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <StackPanel>
        <TreeView x:Name="_treeView" Style="{StaticResource TVallExpanded}"
                ItemsSource="{Binding Path=Root.Elements}"
                ItemTemplate="{StaticResource TVTemplate}" />
    </StackPanel>
</Window>

XAML의 CodeBehind XML을 XDocument에로드하여 TreeView에 바인딩합니다.

public partial class TreeViewer : Window
{
    public TreeViewer()
    {
        InitializeComponent();
        XDocument doc = XDocument.Parse(File.ReadAllText(@"C:\MyWizard.xml"));
        _treeView.DataContext = doc;
    }
}

따라서 XAML 마크 업에서 우리는 TreeViewItem의 헤더에 이름을 바인딩합니다.

<TreeViewItem Header="{Binding Path=Name}"/>

그러나 나는 그것을 묶고 싶다 제목 위의 XML에서 섹션, 루프 및 페이지의 속성. XDocument를 바인딩하는 동안 XPath를 사용하는 것이 불가능하다는 것을 읽었습니다. 그러나 결합하는 방법이 있어야합니다. 제목 TreeViewItem의 헤더 텍스트에 귀속됩니다. @Title,. [ @title] 등을 사용해 보았지만 아무도 작동하지 않았습니다.

이것 MSDN 포럼의 스레드 비슷한 토론이 있습니다.

모든 포인터는 큰 도움이 될 것입니다.

도움이 되었습니까?

해결책

헐 레이 !!! xattribute를 묶는 방법을 알아 냈습니다. 직관적이지 않으며 쉽게 상상할 수 없습니다. 그러나 다음은 어떻게 할 수 있는지가 있습니다.

<TreeViewItem Header="{Binding Path=Attribute[Title].Value}"/>

제목이 정사각형 버팀대에서 직접 사용할 수 있다고 상상하기는 어렵습니다.

More @이 MSDN 링크

다른 팁

나는 당신이해야 할 일은 계층 적 DataTemplate XML의 각 노드 유형에 대해 XML을 xmldataprovider, 그런 다음 묶습니다 저것 TreeView에. TV는 XDP와 함께 데이터를 바인딩하고 라인을 따라 어딘가에 정의한 HDT를 파악하고 데이터 유형을 XML의 노드 이름과 일치시킵니다. 다른 유형의 데이터로 XPath가 변경하는 데 몇 가지 문제가있을 수 있지만 유연성을 유지하는 것은 또 다른 질문입니다.

예를 들어, 약간의 REGEX 테스트 앱이 있습니다. 여기에는 본질적으로 트리에 나열된 모든 다른 Regex 부분 인 도움말 시스템이 포함되어 있습니다 : 설명, 툴팁 및 기타 물건이있는 카테고리 및 부품. 부품에 대한 데이터는 XML 데이터 소스로 저장됩니다. 정적 이후 방금 응용 프로그램의 리소스와 함께 정적 리소스를 만들었습니다.

<XmlDataProvider
    x:Key="rxPartData"
    XPath="RegexParts">
    <x:XData>
        <RegexParts
            xmlns="">
            <Category
                Name="Character class"
                ToolTip="Sets of characters used in matching">
                <RegexPart
                    Regex="[%]"
                    Hint="Positive character group"
                    ToolTip="Matches any character in the specified group (replace % with one or more characters)" />
                <!-- yadda -->
            </Category>
        </RegexParts>
    </x:XData>
</XmlDataProvider>

다음으로, 나는 만들었습니다 계층 적 다타타 템플레이트 데이터의 각 노드 유형에 대해 (다시,이 모든 것은 응용 프로그램의 리소스에 있습니다) :

<!-- Category data template -->
<HierarchicalDataTemplate
    DataType="Category"
    ItemsSource="{Binding XPath=*}">
    <TextBlock
        Focusable="False"
        Text="{Binding XPath=@Name}"
        ToolTip="{StaticResource CategoryTooltip}"
        ToolTipService.InitialShowDelay="0"
        ToolTipService.ShowDuration="{x:Static sys:Int32.MaxValue}"
        ToolTipService.HasDropShadow="True" />
</HierarchicalDataTemplate>
<!-- RegexPart data template -->
<HierarchicalDataTemplate
    DataType="RegexPart"
    ItemsSource="{Binding XPath=*}">
    <WrapPanel
        Focusable="False"
        ToolTip="{StaticResource RegexPartTooltip}"
        ToolTipService.InitialShowDelay="0"
        ToolTipService.ShowDuration="{x:Static sys:Int32.MaxValue}"
        ToolTipService.HasDropShadow="True">
        <TextBlock
            Text="{Binding XPath=@Regex}" />
        <TextBlock
            Text=" - " />
        <TextBlock
            Text="{Binding XPath=@Hint}" />
    </WrapPanel>
</HierarchicalDataTemplate>

마지막으로, 나는 방금 나무를 XmlDataprovider에 묶었 다.

<TreeView
  Name="_regexParts"
  DockPanel.Dock="Top"
  SelectedItemChanged="RegexParts_SelectedItemChanged"
  ItemsSource="{Binding Source={StaticResource rxPartData}, XPath=/RegexParts/Category}"
  ToolTip="Click the + to expand a category; click a part to insert it">
</TreeView>

그리고 그게 당신이해야 할 전부입니다. TreeView와 The xmldataprovider 올바른 것을 찾고 사용하는 것을 돌볼 것입니다 HDT 데이터의 올바른 노드 용. 이 모든 것의 가장 어려운 부분은 바인딩을위한 Xpath를 파악하는 것입니다. 마치 경로가 잘못된 것처럼 조금 까다로워 질 수 있습니다. 결국 나무에 아무것도 얻지 못하고 오류가 없을 것입니다 (WPF의 데이터베인딩에서 오류보고를 증가시키는 방법이 있지만 또 다른 질문입니다). .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top