Aracılığıyla paylaş


L2DBForm.xaml kaynak kodu

Bu sayfa, LINQ to XML örneğikullanılarak WPF veri bağlaması için XAML kaynak dosyasını içerir ve bu dosyayı açıklar.

Genel kullanıcı arabirimi yapısı

WPF projesinde olduğu gibi, bu dosya Window ad alanında türetilmiş sınıf L2XDBFrom ile ilişkili bir LinqToXmlDataBinding XML öğesi olan bir üst öğe içerir.

İstemci alanı, açık mavi bir arka plana sahip olan StackPanel içinde bulunur. Bu panel, DockPanel çubuklarıyla ayrılmış dört Separator kullanıcı arabirimi bölümü içerir. Bu bölümlerin amacı buradaaçıklanmıştır.

Her bölüm, onu tanımlayan bir etiket içerir. İlk iki bölümde, bu etiket LayoutTransformkullanımı aracılığıyla 90 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 denetimleri hizalamak için "çocuk StackPanel" kullanılır.

Pencere kaynağı bölümü

9. satırdaki açılış <Window.Resources> etiketi, pencere kaynağı bölümünün başlangıcını gösterir. 35. satırda kapanış etiketiyle sona erer.

11 ile 25. satırlar arasında yer alan <ObjectDataProvider> etiketi, kaynak olarak bir ObjectDataProvider kullanan LoadedBooksadı verilen bir XElement'i bildirir. XElement, eklenmiş bir XML belgesi (CDATA öğesi) 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 TextBlock denetiminin özel XML biçimlendirme özellikleri olmadığından boşluk korunur.

Son olarak, 28'den 34'e kadar olan satırlarda DataTemplate adlı bir BookTemplate 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

DataTemplate öğesine ek olarak, veri bağlama bu dosyadaki diğer birçok yerde kullanılır.

38. satırdaki açılış <StackPanel> etiketinde, bu panelin DataContext özelliği LoadedBooks veri sağlayıcısına ayarlanır.

DataContext="{Binding Source={StaticResource LoadedBooks}}

Veri bağlamını ayarlamak, TextBlock adlı tbRawXml bu veri sağlayıcısının Xml özelliğine bağlanarak ham XML'yi görüntülemeyi mümkün kılar (46. satırda):

Text="{Binding Path=Xml}"

ListBox kullanıcı arabirimi bölümündeki satırları 58 ile 62 arasındaki , görüntü öğeleri için şablonu, pencere kaynağı bölümünde tanımlanan BookTemplate’e 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>

Üçüncü kullanıcı arabirimi bölümü, Seçili Kitabı Düzenle, öncelikle üst DataContext'ün StackPanel'sini Kitap Listesi kullanıcı arabirimi bölümündeki mevcut seçili öğeye bağlar (satır 82):

DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"

Ardından, kitap öğelerinin geçerli değerlerinin bu paneldeki iki metin kutusunda görüntülenmesi ve bu metin kutularından güncellenmesi için iki yönlü veri bağlamayı kullanır. Dinamik özelliklere veri bağlama, BookTemplate veri şablonunda kullanılan veri bağlamaya benzer:

Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"

Yeni Kitap Ekleson kullanıcı arabirimi bölümü, XAML kodunda veri bağlama kullanmaz. Bunun yerine, veri bağlama L2DBForm.xaml.csdosyasındaki olay işleme kodundadır.

Örnek

Açıklama

Uyarı

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>

Yorumlar

WPF UI öğeleriyle ilişkili olay işleyicilerinin C# kaynak kodu için bkz.kaynak kodu L2DBForm.xaml.cs.

Ayrıca bakınız