L2DBForm.xaml kaynak kodu
Bu sayfa, LINQ to XML örneği kullanılarak WPF veri bağlaması için XAML kaynak dosyasını içerir ve açıklar.
Genel kullanıcı arabirimi yapısı
BIR WPF projesinde olduğu gibi, bu dosya bir üst öğe, ad alanında LinqToXmlDataBinding
türetilmiş sınıfla L2XDBFrom
ilişkilendirilmiş bir Window XML öğesi içerir.
İstemci alanı açık mavi arka plan verilen bir içinde StackPanel yer alır. Bu panel, çubuklarla ayrılmış Separator dört DockPanel kullanıcı arabirimi bölümü 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 LayoutTransform90 derece döndürülür. Bölümün geri kalanında söz konusu 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 çocuk kullanılır.
Pencere kaynağı bölümü
9. satırdaki açma <Window.Resources>
etiketi, pencere kaynağı bölümünün başlangıcını gösterir. 35. satırda kapanış etiketiyle sona erer.
<ObjectDataProvider>
11 ile 25 arasında satıra yayılan etiket, kaynak olarak bir kullanan adlı LoadedBooks
bir XElement bildirirObjectDataProvider. XElement, katıştırılmış XML belgesi (öğeCDATA
) ayrıştırılarak başlatılır. Ekli XML belgesi bildirilirken ve ayrıştırıldığında boşluk korunduğuna dikkat edin. Ham XML'yi görüntülemek için kullanılan denetimin TextBlock özel XML biçimlendirme özellikleri olmadığından boşluk korunur.
Son olarak, bir DataTemplate adlandırılmış BookTemplate
28 ile 34 arasında satırlarda tanımlanır. Bu şablon, Kitap Listesi kullanıcı arabirimi bölümündeki girdileri görüntülemek için kullanılır. Aşağıdaki atamalar aracılığıyla kitap kimliğini ve kitap adını almak için veri bağlama ve LINQ to XML dinamik özelliklerini kullanır:
Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"
Veri bağlama kodu
öğesine ek olarak DataTemplate , veri bağlama bu dosyadaki diğer birçok yerde kullanılır.
38. satırdaki açılış <StackPanel>
etiketinde DataContext , bu panelin özelliği veri sağlayıcısına LoadedBooks
ayarlanır.
DataContext="{Binding Source={StaticResource LoadedBooks}}
Veri bağlamını ayarlamak, bu veri sağlayıcısının TextBlock özelliğine bağlanarak adlandırılmış tbRawXml
için ham XML'nin Xml
görüntülenmesini mümkün kılar (46. satırda):
Text="{Binding Path=Xml}"
ListBoxKitap Listesi kullanıcı arabirimi bölümündeki 58 ile 62 arası satırlarda, görüntü öğeleri BookTemplate
için şablonu pencere kaynağı bölümünde tanımlanan şekilde ayarlar:
ItemTemplate ="{StaticResource BookTemplate}"
Ardından, 59 ile 62 arasında satırlarda, kitapların gerçek değerleri şu liste kutusuna bağlıdır:
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
Seçili Kitabı Düzenle adlı üçüncü kullanıcı arabirimi bölümü, ilk DataContextStackPanel olarak üst öğenin seçili olan öğesini Kitap Listesi kullanıcı arabirimi bölümünden (satır 82) bağlar:
DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"
Ardından, kitap öğelerinin geçerli değerlerinin bu paneldeki iki metin kutusuna görüntülenmesi ve bu kutuya güncelleştirilmesi için iki yönlü veri bağlamayı kullanır. Dinamik özelliklere veri bağlama, veri şablonunda kullanılan veri bağlamasına BookTemplate
benzer:
Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"
Son kullanıcı arabirimi bölümü olan Yeni Kitap Ekle, XAML kodunda veri bağlama kullanmaz. Bunun yerine, veri bağlama L2DBForm.xaml.cs dosyasındaki olay işleme kodundadır.
Örnek
Tanım
Dekont
Aşağıdaki kodu Visual Studio'daki C# kaynak kodu düzenleyicisi gibi bir kod düzenleyicisine kopyalamanızı öneririz, böylece satır numaralarının izlenmesi daha kolay olur.
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>
Açıklamalar
WPF UI öğeleriyle ilişkili olay işleyicilerinin C# kaynak kodu için bkz . L2DBForm.xaml.cs kaynak kodu.
Ayrıca bkz.
.NET Desktop feedback