2

私はグーグルでいくつかの検索をしていて、ここでいくつかの同様の質問を読んでいますが、私の質問に対する答えはまだ見つかりません。xmlファイルをWPFのツリービューコントロールにバインドしています。この記事を使用すると、xmlファイルを使用して双方向のデータバインディングを簡単に設定できます。

ただし、添付する前にxmlドキュメントに並べ替えを適用したいと思います。タスクに開始日と期日が含まれているタスクオーガナイザーをモデル化しています。最も緊急のタスクが最初に表示されるように、保留中の期日でノードを並べ替えたいと思います。Linq to XMLの経験はありますが、バインディングの問題にどのように取り組むかがわかりません。何かご意見は?

したがって、ここでもう少し読んだ後、私の擬似コードがあります:

  • ローカルXMLファイルからXDocumentを作成します
  • タスクの期日に基づいてXDocumentを並べ替えます
  • 新しくソートされたXDocumentから新しいXmlDataProviderを作成します
  • TreeViewにバインドします

誰かが私がこれを洗い流すのを手伝ってもらえますか?

4

1 に答える 1

3

XMLからTreeViewへのバインディングを実装する方法の基本的な例を次に示します。XmlDataProviderを使用すると、XMLドキュメントをロードしてバインドできます。HierarchicalDataTemplateを使用すると、サブアイテムを使用してTreeViewテンプレートを定義できます。バインドには、Pathの代わりにXPathを使用する必要があり、@記号のプレフィックスは属性へのバインドを示します。

<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 XPath=@Name, Mode=TwoWay}" />
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate x:Key="rootTemplate" ItemsSource="{Binding XPath=FavoriteColors/Color}" ItemTemplate="{StaticResource colorsTemplate}">
            <StackPanel Orientation="Horizontal">
                <TextBox Text="{Binding XPath=@FirstName, Mode=TwoWay}" />
                <TextBlock Text=" " />
                <TextBox Text="{Binding XPath=@LastName, Mode=TwoWay}" />
                <TextBlock Text=" (Age: " />
                <TextBox Text="{Binding XPath=@Age, 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);
        }
    }
}
于 2012-06-08T18:59:51.923 に答える