Aracılığıyla paylaş


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ı LoadedBooksbir 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.