XML Datei mit extrem wenig Codezeilen via Data Binding bearbeiten

Wie kann ich in .NET mit möchst wenigen Codezeilen und möglichst viel XAML eine XML-Datei bearbeiten? Es ist tatsächlich mit sehr wenigen Zeilen möglich. Man sieht nur vor lauter Codebeispielen die Lösung nicht. Im Prinzip sagt die MSDN-Dokumentation schon viel: Mit XMLDataProvider können die einer Oberfläche zugrunde liegenden Daten via Data Binding irgendein XML-Knoten sein.

Hier die XML-Datei, die meiner Beispieloberfläche als Datengrundlage dient:

<?xml version="1.0" encoding="utf-8"?>
<Books xmlns="">
  <Book ISBN="0-7356-0562-9" Stock="in">
    <Title>XML in Action</Title>
    <Summary>XML Web Technology</Summary>
    <Cover>http://www.microsoft.com/library/images/worldwide/mspress/2461.gif</Cover>
  </Book>
  <Book ISBN="0-7356-1377-X" Stock="in">
    <Title>Introducing Microsoft .NET</Title>
    <Summary>Overview of .NET Technology</Summary>
    <Cover>http://www.microsoft.com/library/images/worldwide/mspress/5201.gif</Cover>
  </Book>
  <Book ISBN="0-7356-1288-9" Stock="out">
    <Title>Inside C#</Title>
    <Summary>C# Language Programming</Summary>
    <Cover>http://www.microsoft.com/MSPress/books/imgt/5027.gif</Cover>
  </Book>
  <!--lsdfkgsdlkfgölsdfgls-->
  <Book ISBN="0-7356-1370-2" Stock="in">
    <Title>Programming Microsoft Windows With C#</Title>
    <Summary>C# Programming using the .NET Framework</Summary>
    <Cover>http://www.microsoft.com/MSPress/books/imgt/5188.gif</Cover>
  </Book>
  <Book ISBN="0-7356-1448-2" Stock="out">
    <Title>Microsoft C# Language Specifications</Title>
    <Summary>The C# language definition</Summary>
    <Cover>http://www.microsoft.com/MSPress/books/imgt/5490.gif</Cover>
  </Book>
  <Table>
  </Table>
</Books>

Mit XPath navigiere ich in der Datengrundlade und weise meinen Controls ihren XML-Knoten zu. Hier der XAML-Code:


<Window x:Class="XMLEdit.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Height="350" Width="525">

        <Window.Resources>
        <XmlDataProvider x:Key="BookData" Source="C:\Users\Oliver\Documents\Visual Studio 2010\Projects\XMLEdit\XMLEdit\books.xml" XPath="Books" />
        <DataTemplate x:Key="BookDataTemplate">
            <Border SnapsToDevicePixels="True" Padding="10" Margin="5" CornerRadius="5" BorderThickness="2" BorderBrush="SteelBlue" >
                <StackPanel>
                    <TextBlock Text="{Binding XPath=Title}" FontSize="14" FontWeight="Bold" Margin="0,0,0,5"></TextBlock>
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <Image Source="{Binding XPath=Cover}" Width="100"></Image>
                        <StackPanel Orientation="Vertical">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="ISBN: " FontWeight="Bold"></TextBlock>
                                <TextBox Text="{Binding XPath=@ISBN}" Foreground="OrangeRed"></TextBox>
                            </StackPanel>
                            <TextBox Text="{Binding XPath=Summary}" Margin="0,5,0,0"></TextBox>
                        </StackPanel>
                    </StackPanel>
                </StackPanel>
            </Border>
        </DataTemplate>
        <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListBoxItem}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>

    </Window.Resources>

    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">

        <StackPanel>
            <TextBlock Text="Edit XML File using Data Binding via XPath and XMLDataProvider" Padding="5" Height="27" VerticalAlignment="Bottom" ></TextBlock>
            <TextBlock Text="This sample uses extremely few code lines" Padding="5" Height="27" VerticalAlignment="Bottom" ></TextBlock>
            <StackPanel>
                <Button Content="Save"
                Click="Button_Save_Click"
                Margin="0 0 0 10" Height="27" Width="56" />
            </StackPanel>
            <Grid x:Name="Grid1">
                <ListBox
                    ItemsSource="{Binding Source={StaticResource BookData}, XPath=Book}"
                    ItemTemplate="{StaticResource BookDataTemplate}"
                    ItemContainerStyle="{StaticResource StretchedContainerStyle}" >
                </ListBox>
            </Grid>
        </StackPanel>
    </ScrollViewer>
</Window>

Ein paar wenige Codezeilen waren dann doch nötig, um das implizit geladene XMLDocument des XMLDataProvider zu speichern:

using System.Windows;
using System.Windows.Data;

namespace XMLEdit
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Save_Click(object sender, RoutedEventArgs e)
        {

            XmlDataProvider myXmlDataProvider = (XmlDataProvider)Grid1.FindResource("BookData");
            myXmlDataProvider.Document.Save("C:\\Users\\Oliver\\Documents\\Visual Studio 2010\\Projects\\XMLEdit\\XMLEdit\\books.xml");
        }
    }
}
 

Hinterlassen Sie eine Antwort