L2DBForm.xaml kaynak kodu
Bu sayfa, örnek kullanarak WPF veri bağlaması için XAML kaynak dosyasını içerir ve LINQ to XML açıklar.
Genel kullanıcı arabirimi yapısı
WPF projesinde olduğu gibi, bu dosya ad alanı içindeki türetilmiş sınıfla ilişkili bir XML öğesi olan Window bir üst L2XDBFrom öğe LinqToXmlDataBinding içerir.
İstemci alanı açık mavi arka StackPanel plan verilen bir içinde yer almaktadır. Bu panel, çubuklarla DockPanel ayrılmış dört kullanıcı arabirimi bölümü Separator içerir. Bu bölümlerin amacı burada açıklanmıştır.
Her bölüm, onu tanımlayan bir etiket içerir. İlk iki bölümde bu etiket, kullanımıyla 90 derece LayoutTransform döndürülür. Bölümün geri kalanında bu bölümün amacına uygun kullanıcı arabirimi öğeleri (örneğin, metin blokları, metin kutuları ve düğmeler) bulunur. Bazen bu alt StackPanel denetimleri hizalamak için bir alt kullanılır.
Pencere kaynağı bölümü
<Window.Resources>9. satırda açılan etiket pencere kaynağı bölümünün başlangıcını gösterir. 35. satırda kapanış etiketiyle biter.
11 ile 25 arasındaki satırları kapsayan etiket, kaynak olarak bir kullanan adlı bir <ObjectDataProvider>ObjectDataProviderLoadedBooksXElement bildirer. XElement, ekli bir XML belgesi (bir öğesi) ayrıştırarak CDATA başlatılır. Ekli XML belgesi bildirilmesinde ve ayrıştırıldıklarda boşluk korunacaktır. Ham XML'i görüntülemek için kullanılan denetim özel XML biçimlendirme özelliğine sahip olduğundan TextBlock boşluk korunur.
Son olarak, DataTemplateBookTemplate 28- 34. satırlarda adlı bir tanımlanır. Bu şablon, Kitap Listesi kullanıcı arabirimi bölümündeki girişleri görüntülemek için kullanılır. Aşağıdaki atamalar aracılığıyla LINQ to XML ve kitap adını almak için veri bağlamayı ve dinamik özellikleri kullanır:
Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"
Veri bağlama kodu
öğesine ek DataTemplate olarak, veri bağlaması bu dosyada başka bir dizi yerde kullanılır.
<StackPanel>38. satırda açılan etikette, DataContext bu panelin özelliği veri sağlayıcısı LoadedBooks olarak ayarlanır.
DataContext="{Binding Source={StaticResource LoadedBooks}}
Veri bağlamını ayarlama, adlı için bu veri sağlayıcısının özelliğine bağlanarak ham XML'in 46. satırda TextBlocktbRawXml görüntülemesini mümkün Xml yapar:
Text="{Binding Path=Xml}"
Kitap Listesi kullanıcı arabirimi bölümündeki ListBox 58. ve 62. satırlarda, görüntüleme öğeleri için şablonu pencere kaynağı bölümünde tanımlanan olarak ListBoxBookTemplate ayarlar:
ItemTemplate ="{StaticResource BookTemplate}"
Ardından 59- 62. satırlarda kitapların gerçek değerleri şu liste kutusuna bağlı olur:
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
Üçüncü kullanıcı arabirimi bölümü olanSeçilen Kitabı Düzenle bölümü, önce üst öğenin öğesini Kitap Listesi kullanıcı arabirimi bölümünden StackPanel (82. StackPanel satır) şu anda seçili olan öğeye bağlar:
DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"
Ardından, kitap öğelerinin geçerli değerlerinin bu panelde yer alan iki metin kutusuna görüntülenmesi ve buradan güncelleştirilsi için iki yol veri bağlaması kullanır. Dinamik özelliklere veri bağlama, veri şablonunda kullanılan veri BookTemplate bağlamaya benzer:
Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"
Son kullanıcı arabirimi olan Yeni Kitap Eklebölümü, XAML kodunda veri bağlamayı kullanmaz. Bunun yerine, veri bağlama L2DBForm.xaml.cs dosyasındaki olay işleme kodundadır.
Örnek
Açıklama
Not
Satır numaralarının daha kolay takip etmek için aşağıdaki kodu Visual Studio C# kaynak kodu düzenleyicisi gibi bir kod düzenleyicisine kopyalamanız önerilir.
Kod
<Window x:Class="LinqToXmlDataBinding.L2XDBForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:xlinq="clr-namespace:System.Xml.Linq;assembly=System.Xml.Linq"
xmlns:local="clr-namespace:LinqToXmlDataBinding"
Title="WPF Data Binding using LINQ-to-XML" Height="665" Width="500" ResizeMode="NoResize">
<Window.Resources>
<!-- Books provider and inline data -->
<ObjectDataProvider x:Key="LoadedBooks" ObjectType="{x:Type xlinq:XElement}" MethodName="Parse">
<ObjectDataProvider.MethodParameters>
<system:String xml:space="preserve">
<![CDATA[
<books xmlns="http://www.mybooks.com">
<book id="0">book zero</book>
<book id="1">book one</book>
<book id="2">book two</book>
<book id="3">book three</book>
</books>
]]>
</system:String>
<xlinq:LoadOptions>PreserveWhitespace</xlinq:LoadOptions>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<!-- Template for use in Books List listbox. -->
<DataTemplate x:Key="BookTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="3" Text="{Binding Path=Attribute[id].Value}"/>
<TextBlock Margin="3" Text="-"/>
<TextBlock Margin="3" Text="{Binding Path=Value}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<!-- Main visual content container -->
<StackPanel Background="lightblue" DataContext="{Binding Source={StaticResource LoadedBooks}}">
<!-- Raw XML display section -->
<DockPanel Margin="5">
<Label Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" FontWeight="Bold">XML
<Label.LayoutTransform>
<RotateTransform Angle="90"/>
</Label.LayoutTransform>
</Label>
<TextBlock Name="tbRawXml" Height="200" Background="LightGray" Text="{Binding Path=Xml}" TextTrimming="CharacterEllipsis" />
</DockPanel>
<Separator Height="4" Margin="5" />
<!-- List box to display all books section -->
<DockPanel Margin="5">
<Label Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" FontWeight="Bold">Book List
<Label.LayoutTransform>
<RotateTransform Angle="90"/>
</Label.LayoutTransform>
</Label>
<ListBox Name="lbBooks" Height="200" Width="415" ItemTemplate ="{StaticResource BookTemplate}">
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
</ListBox>
<Button Margin="5" DockPanel.Dock="Right" Height="30" Width ="130" Content="Remove Selected Book" Click="OnRemoveBook">
<Button.LayoutTransform>
<RotateTransform Angle="90"/>
</Button.LayoutTransform>
</Button>
</DockPanel>
<Separator Height="4" Margin="5" />
<!-- Edit current selection section -->
<DockPanel Margin="5">
<TextBlock Margin="5" Height="30" Width="65" DockPanel.Dock="Right" Background="LightGray" TextWrapping="Wrap" TextAlignment="Center">
Changes are live!
<TextBlock.LayoutTransform>
<RotateTransform Angle="90"/>
</TextBlock.LayoutTransform>
</TextBlock>
<StackPanel>
<Label Width="450" Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" FontWeight="Bold">Edit Selected Book</Label>
<StackPanel Margin="1" DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}">
<StackPanel Orientation="Horizontal">
<Label Width="40">ID:</Label>
<TextBox Name="editAttributeTextBox" Width="410" Text="{Binding Path=Attribute[id].Value}">
<TextBox.ToolTip>
<TextBlock FontWeight="Bold" TextAlignment="Center">
<Label>Edit the selected book ID and see it changed.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Width="40">Value:</Label>
<TextBox Name="editValueTextBox" Width="410" Text="{Binding Path=Value}" Height="25">
<TextBox.ToolTip>
<TextBlock FontWeight="Bold" TextAlignment="Center">
<Label>Edit the selected book Value and see it changed.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
</StackPanel>
</StackPanel>
</DockPanel>
<Separator Height="4" Margin="5" />
<!-- Add new book section -->
<DockPanel Margin="5">
<Button Margin="5" Height="30" DockPanel.Dock="Right" Click ="OnAddBook">Add Book
<Button.LayoutTransform>
<RotateTransform Angle="90"/>
</Button.LayoutTransform>
</Button>
<StackPanel>
<Label Width="450" Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" FontWeight="Bold">Add New Book</Label>
<StackPanel Margin="1">
<StackPanel Orientation="Horizontal">
<Label Width="40">ID:</Label>
<TextBox Name="tbAddID" Width="410">
<TextBox.ToolTip>
<TextBlock FontWeight="Bold" TextAlignment="Center">
<Label>Enter a book ID and Value pair, then click Add Book.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Width="40">Value:</Label>
<TextBox Name="tbAddValue" Width="410" Height="25">
<TextBox.ToolTip>
<TextBlock FontWeight="UltraBold" TextAlignment="Center">
<Label>Enter a book ID and Value pair, then click Add Book.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
</StackPanel>
</StackPanel>
</DockPanel>
</StackPanel>
</Window>
Yorumlar
WPF kullanıcı arabirimi öğeleriyle ilişkili olay işleyicileri için C# kaynak kodu için bkz. L2DBForm.xaml.cs kaynak kodu.