كيفية ربط Xml السمة Treeview العقد ، في حين ربط البيانات XDocument إلى WPF Treeview

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

سؤال

لدي XML التي تحتاج إلى databound إلى WPF TreeView.هنا XML يمكن أن يكون لها بنية مختلفة.TreeView ينبغي databound عامة بما فيه الكفاية إلى تحميل أي التقليب من التسلسل الهرمي.ومع ذلك XAttribute على العقد (يسمى العنوان) يجب أن يكون databound إلى TreeViewItem هو رأس النص و وليس باسم العقدة.

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 أعلاه.قرأت أنه ليس من الممكن استخدام XPath حين ربط XDocument.ولكن يجب أن يكون هناك طريقة لربط العنوان السمة TreeViewItem رأس النص.حاولت باستخدام @العنوان .[@العنوان] الخ.ولكن لا يبدو أن العمل.

هذا موضوع على منتديات MSDN وقد مناقشة مماثلة.

أية ملاحظات قد تكون مفيدة بشكل كبير.

هل كانت مفيدة؟

المحلول

مرحى !!!عرفت كيف تربط XAttribute.أنها ليست بديهية وهي ليست بسهولة التي يمكن تخيلها.ولكن هنا هو كيف يمكن القيام به.

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

فمن الصعب أن نتصور أن العنوان مباشرة يمكن أن تستخدم في الأقواس المربعة.

أكثر @ هذا الرابط MSDN

نصائح أخرى

أعتقد أن كل ما عليك القيام به هو إنشاء HierarchicalDataTemplate لكل نوع العقدة في XML, تحميل xml إلى XmlDataProvider, ثم ربط أن إلى TreeView.التلفزيون يعمل مع XDP لربط البيانات في مكان ما على طول الخط أنها معرفة ما HDTs لديك تعريف تطابق نوع البيانات إلى أسماء العقد في 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>

المقبل, أنا خلقت HierarchicalDataTemplates لكل نوع العقدة في البيانات (مرة أخرى ، كل هذا في تطبيق موارد):

<!-- 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 ، XmlDataProvider سوف تأخذ الرعاية من إيجاد واستخدام الصحيح HDT هو من أجل تصحيح العقد في البيانات.الجزء الأصعب من كل هذا هو معرفة الخاص بك مسارات xpath الملزمة.فإنه يمكن الحصول على صعبة قليلا, كما لو المسارات الخاصة بك غير صحيحة, سوف ينتهي بك الأمر الحصول على شيء في الشجرة و لن يكون هناك أي أخطاء (هناك طرق لزيادة التقرير عن الخطأ في ربط البيانات في برنامج الأغذية العالمي ، ولكن هذا سؤال آخر).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top