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");
}
}
}