WPF и LINQ to XML привязка данных к списку - PullRequest
1 голос
/ 15 апреля 2010

У меня возникли проблемы с правильной привязкой списка к источнику данных XML (текстовый файл .xml).

Я учусь использовать WPF и LINQ to XML, следуя примеру Microsoft со списком книг, который привязан к встроенному источнику XML, показанному здесь ...

http://msdn.microsoft.com/en-us/library/bb669149.aspx

Я пытаюсь изменить приложение, чтобы оно правильно связывалось с внешним XML-файлом.

Итак, я попытался следовать изменениям в примере, показанном в статье кода проекта 238_How_to_perform_WPF_Data_Binding_using_LINQ_to_XML _-_ Part_2.aspx

(код XAML указан ниже)

, который показывает, как изменить приложение для использования внешнего XML-файла.

Проблема, с которой я столкнулся, заключается в том, что при запуске приложения список не отображает / не загружает данные, которые уже находятся в моем XML-файле. Строка данных XML правильно отображается в текстовом поле над ней, и я могу использовать функцию Добавить, чтобы добавить новую книгу, которая затем корректно отображается в списке, и я могу выбрать ее и отредактировать - она ​​просто не загружает существующие данные из XML-файла при запуске или инициализации.

кто-нибудь пробовал этот пример, или у кого-нибудь есть рабочий пример со списком или сеткой данных, привязанной к файлу XML?

приведенный ниже код XAML, кто-то может указать на ошибку?

<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="Load">
        <ObjectDataProvider.MethodParameters>
            <system:String>C:\Files\devel\linq example\LinqToXMLDataBinding\mydata.xml</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=Element[title].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="xml"/>
            </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=Element[title].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>

1 Ответ

0 голосов
/ 03 января 2011

Вы, наверное, уже поняли это, но одна вещь, которая необходима, должна предшествовать ссылкам Element в шаблоне данных с пространством имен, которое (должно быть, если вы точно следовали примеру) во внешнем XML-файле: Text = "{Binding Path = Element [{http://www.mybooks.com}id].Value}"/>

Остальные проблемы, с которыми я столкнулся, еще не решены -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...